安卓对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 }

最后是结果展示:获取权限以及在相册中找到保存的图片

 

posted @ 2020-06-10 01:37  不爱学习的小策  阅读(5425)  评论(0编辑  收藏  举报