本文共 3848 字,大约阅读时间需要 12 分钟。
Easypermissions简化了Android M的运行时权限的申请、结果处理
Android M对权限系统进行了改变 Android M之前所需权限只需要在AndroidManifest中申请即可。但更新Android M系统后,部分“Dangerous Permission”需要在运行时询问申请
在Android6.0 sdk api level 23之前只需要AndroidManifest.xml中申请所需的权限,读写SD卡为例
private void writeFile(File fileName, String info){ try { OutputStream fout = new BufferedOutputStream( new FileOutputStream(fileName)); byte[] bytes = info.getBytes(); fout.write(bytes); fout.close(); } catch (Exception e) { e.printStackTrace(); } } private String readFile(File file) { String Strtmp = null; try { InputStream fin = new BufferedInputStream(new FileInputStream(file)); int filelength = fin.available(); byte[] bytes = new byte[filelength]; fin.read(bytes); Strtmp = new String(bytes); return Strtmp; } catch (Exception err) { return ""; } }
在Android7.0上测试,没有做修改,会出现Warr并且写文件失败
01-01 01:11:28.127 3764 3764 W System.err: java.io.FileNotFoundException: /mnt/sdcard/test (Permission denied)01-01 01:11:28.127 3764 3764 W System.err: at java.io.FileOutputStream.open(Native Method)01-01 01:11:28.127 3764 3764 W System.err: at java.io.FileOutputStream.(FileOutputStream.java:221)01-01 01:11:28.127 3764 3764 W System.err: at java.io.FileOutputStream. (FileOutputStream.java:169)01-01 01:11:28.127 3764 3764 W System.err: at com.bshui.easypermissiondemo.MainActivity.writeFile(MainActivity.java:61)
解决:检查运行时权限—>申请权限—>接收权限处理结果
int checkSelfPermission(String permission) 用来检测应用是否已经具有权限 void requestPermissions(String[] permissions, int requestCode) 进行请求单个或多个权限 void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 用户对请求作出响应后的回调
//1.检查权限if(!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){ Toast.makeText(getApplicationContext(),"需要动态申请sd卡写权限", Toast.LENGTH_LONG).show(); requestSdWritePermission(); }//2.申请权限 private static final int REQUEST_PERMISSION_SD_WRITE_CODE = 1; private void requestSdWritePermission(){ requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_SD_WRITE_CODE); }//3.处理申请权限结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == REQUEST_PERMISSION_SD_WRITE_CODE){ Toast.makeText(getApplicationContext(),"申请sd卡写权限成功", Toast.LENGTH_LONG).show(); } }
申请成功后可以对sd卡进行读写了
1)引用库
dependencies { implementation 'pub.devrel:easypermissions:1.2.0'}
2)检查权限
//1.检查权限,把所要检查的所有权限放在perms数组里private static final int REQUEST_PERMISSION_SD_WRITE_CODE = 1; String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE};if(EasyPermissions.hasPermissions(this,perms)) { //如果有权限,正常流程 } else{ //如果没有权限,现在申请 EasyPermissions.requestPermissions(this, "写文件需要写文sd卡权限", REQUEST_PERMISSION_SD_WRITE_CODE, perms); }
3)处理结果
//处理申请权限结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions,grantResults,this); }
总结:对于一个应用程序需要多个权限用EasyPermissions还是比较方便的