最近学校做项目,涉及到保存一个图片到手机相册(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();
最后是结果展示:获取权限以及在相册中找到保存的图片