zoukankan      html  css  js  c++  java
  • 安卓对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 }

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

     

  • 相关阅读:
    活动的生命周期
    活动
    开始编程前的准备工作
    数组转List
    Word根据模板生成数据
    Excel根据模板生成数据
    php取年份区间
    世界 国家 省份 sql
    相册处理,php中获取一组前缀相同的元素值
    mysql添加字段
  • 原文地址:https://www.cnblogs.com/occlive/p/Picture.html
Copyright © 2011-2022 走看看