安卓對sdcard進行權限訪問——實現保存圖片到相冊的功能


最近學校做項目,涉及到保存一個圖片到手機相冊(sdcard文件)中的功能。網上有很多攻略,不過都只是泛泛而談,沒有詳細的解說;

特別是權限這方面說得不夠明白,所以我會對權限這塊進行詳解。


 

首先對功能進行拆分,即兩步:

1.獲取手機外部存儲的權限

2.將圖片保存到手機外部存儲空間(相冊)

首先是AndroidStudio的版本(不同的版本配置可能會有所出入)

  1. 獲取權限  
    • 動態申請權限
    • 在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);
      
          }

       

  1. 保存到相冊
    • 自定義保存文件方法: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 }

最后是結果展示:獲取權限以及在相冊中找到保存的圖片

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM