[英]Run Time Permission check in Android 7.0
當我在sdcard中嘗試createFile時:
newFile.createNewFile();
我得到的日志如下:
W / System.err:java.io.IOException:權限被拒絕
W / System.err:at java.io.UnixFileSystem.createFileExclusively0(Native Method)
W / System.err:在java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:280)
W / System.err:at java.io.File.createNewFile(File.java:948)
我知道原因是沒有授予危險的運行時權限(WRITE_EXTERNAL_STORAGE),但是當我嘗試在PackageManagerService.java checkUidPermission()
打印日志時,發現它沒有被調用。
我想知道本機方法(如java.io.UnixFileSystem.createFileExclusively0
)如何判斷未授予運行時權限?
從Android M,可以由用戶而不是安裝時間授予/撤銷運行時權限。
因此,當使用M及更高版本定位設備時,您需要檢查是否已授予權限我使用此類檢查權限,我希望它有所幫助:
/**
* Created by Mani on 17/09/16.
* Making the runtime app permissions for android marshmallow+ devices cleaner
* Specify all the requests here
*/
public class MarshMallowPermission {
private static final int CALL_PERMISSION_REQUEST_CODE = 1;
public static final int EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 2;
public static final int CAMERA_PERMISSION_REQUEST_CODE = 3;
public static final int SHORT_CUT_PERMISSION_REQUEST_CODE = 4;
private Activity activity;
public MarshMallowPermission(Activity activity) {
this.activity = activity;
}
public boolean checkPermissionForCall(){
int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.CALL_PHONE);
return result == PackageManager.PERMISSION_GRANTED;
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public boolean checkPermissionForShortCut(){
int result = PermissionChecker.checkSelfPermission(activity,Manifest.permission.INSTALL_SHORTCUT);
return result == PermissionChecker.PERMISSION_GRANTED;
}
public boolean checkPermissionForExternalStorage(){
int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
int readStorage = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
readStorage = ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
}
return result == PackageManager.PERMISSION_GRANTED && readStorage == PackageManager.PERMISSION_GRANTED;
}
public boolean checkPermissionForCamera(){
int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);
return result == PackageManager.PERMISSION_GRANTED;
}
public void requestPermissionForCall(){
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CALL_PHONE)){
Toast.makeText(activity, "Call Phone Permission required to launch Dialer. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CALL_PHONE},CALL_PERMISSION_REQUEST_CODE);
}
}
public void requestPermissionForExternalStorage(){
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)){
Toast.makeText(activity, "External Storage permission required. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
}else{
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
}
}
}
public void requestPermissionForCamera(){
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)){
Toast.makeText(activity, "Camera permission required. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);
}
}
public void requestPermissionForShortCut(){
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.INSTALL_SHORTCUT)){
Toast.makeText(activity, "Create ShortCut permission required. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.INSTALL_SHORTCUT},SHORT_CUT_PERMISSION_REQUEST_CODE);
}
}
}
活動內部使用:
MarshMallowPermission marshMallowPermission = new MarshMallowPermission(MyActivity.this);
marshMallowPermission.checkPermissionForCall();
marshMallowPermission.requestPermissionForCall();
如果您有任何疑問,請在下面評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.