最近學校做項目,涉及到保存一個圖片到手機相冊(sdcard文件)中的功能。網上有很多攻略,不過都只是泛泛而談,沒有詳細的解說;
特別是權限這方面說得不夠明白,所以我會對權限這塊進行詳解。
首先對功能進行拆分,即兩步:
1.獲取手機外部存儲的權限
2.將圖片保存到手機外部存儲空間(相冊)
首先是AndroidStudio的版本(不同的版本配置可能會有所出入)
- 獲取權限
- 動態申請權限
- 在AndroidManifest.xml中進行權限聲明
-
1 <!--對SD卡進行寫入操作--> 2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 3 <!--對SD卡進行讀取操作--> 4 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 5 <!--對SD卡進行文件的創建和刪除操作--> 6 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" 7 tools:ignore="ProtectedPermissions" />
-
因為我的
targetSdkVersion
版本為29,外部訪問權限受限,所以需要在<application/>標簽添加屬性,來請求使用舊的存儲模式。 - 1 android:requestLegacyExternalStorage="true"
- 在MainActivity.java文件進行動態權限申請,(點擊事件或主線程均可
-
1 //REQUEST_GPS為自定義int型靜態常量;private final int REQUEST_GPS = 1; 2 ActivityCompat.requestPermissions(MainActivity.this, 3 new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, 4 Manifest.permission.READ_EXTERNAL_STORAGE, 5 Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS} 6 , REQUEST_GPS);
- 動態申請的回調方法:
-
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "Permission GET", Toast.LENGTH_SHORT).show(); //保存圖片的方法,自定義 saveBitmap(); } else { // Permission Denied Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show(); } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }
- 保存到相冊
- 自定義保存文件方法:saveBitmap();
-
1 public void saveBitmap() { 2 Log.e("開始保存", "保存圖片"); 3 //獲得SD卡的根路徑 4 File sd = Environment.getExternalStorageDirectory(); 5 //獲取SD卡是否能夠訪問 6 boolean can_write = sd.canWrite(); 7 Log.e("是否被訪問", can_write + ""); 8 //在sd卡路徑下創建一個后綴為.jpg的文件 9 File f = new File( Environment.getExternalStorageDirectory()+"/weather.jpg"); 10 //如果文件存在的話,就刪除原來的文件。 11 if (f.exists()) { 12 f.delete(); 13 } 14 try { 15 //文件輸出流 16 FileOutputStream out = new FileOutputStream(f); 17 //bm為私有的Bitmap類型的變量。private Bitmap bm; 18 //調用bitmap的compress方法 19 /* 20 *Bitmap.CompressFormat format 圖像的壓縮格式; 21 *int quality 圖像壓縮率,0-100。 0 壓縮100%,100意味着不壓縮; 22 *OutputStream stream 寫入壓縮數據的輸出流; 23 * */ 24 bm.compress(Bitmap.CompressFormat.PNG, 90, out); 25 //刷新 26 out.flush(); 27 //關閉輸出流 28 out.close(); 29 Log.e("保存", "已經保存"); 30 } catch (FileNotFoundException e) { 31 // TODO Auto-generated catch block 32 e.printStackTrace(); 33 } catch (IOException e) { 34 // TODO Auto-generated catch block 35 e.printStackTrace(); 36 } 37 }
- 自定義保存文件方法:saveBitmap();
最后是結果展示:獲取權限以及在相冊中找到保存的圖片