2017-04-21 83 views
2

我有我这样的代码来检查摄像头权限。目标sdk 22或​​更低的Android检查摄像头权限

if (Build.VERSION.SDK_INT >= 23) { 
Log.e("Permission State",ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA)+""); 

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED){ 
showCameraActivityForResult(activity); 
}else { 
// No explanation needed, we can request the permission. 
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, Constant.MY_PERMISSIONS_REQUEST_CAMERA); 
} 
}else{ 
showCameraActivityForResult(activity); 
} 

问题是我总是有5.1或更低的权限。其他用户也在这里说。

How can I know if my app's camera permission is granted?

在像三星一些设备,用户可以从设备的设置,因此禁用摄像头权限,当用户打开我的应用程序并点击相机,它总是显示为空白。如何检测用户是否可以使用相机? (它需要与我的代码不同,因为它不起作用)。

+0

你不要求检查以下任何权限Lolipop(22)OS在Lolipop中引入的运行时权限更改。 – Avi

+0

第一次授予权限(22以下的默认行为),但用户稍后会从三星设备的设备设置中禁用它。我该怎么办? –

回答

1

如果在清单中指定了API 22和更低权限,可用于API 23+ ContextCompat#checkSelfPermission。它在早期的API上“优雅地降级”,并且会告诉你,如果它出现在清单中,则授予许可。在API 23及以上版本中,它会实际检查它是否被授予。

如果授予权限,则返回PackageManager.PERMISSION_GRANTED

ActivityManifest.permission.CAMERA联系以避免拼写错误。

ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)); 
+0

我需要检查下面的api 22.我该如何检查?对于22岁以下,我不能使用checkSelfPermission。我需要一种方法来了解由于用户限制或其他原因无法使用相机。 –

+0

用户不能在22及以下限制权限。如果他们不想给予您的应用权限,他们的唯一选择是不安装该应用。 – Andy

+0

我有三星设备,并在设备设置,用户可以手动禁用相机的权限,我的应用程序。:( –

2

如果使用AppCompatActivity,您可以使用checkSelfPermission检查权限已被授予。

if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
    if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.CAMERA)) { 

     //Show permission dialog 
    } else { 

     // No explanation needed, we can request the permission. 
     ActivityCompat.requestPermissions((Activity)context, new String[]{Manifest.permission.CAMERA}, code); 
    } 
} 
+0

我需要检查下面的api 22.我该如何检查?对于22岁以下,我不能使用checkSelfPermission。我需要一种方法来了解由于用户限制或其他原因无法使用相机。 –

+0

是的,checkSelfPermission不可用于低于22的api。因为您不需要检查它。您只需要在清单中声明权限,并且用户将在安装期间授予权限。如果您看到某些设备具有禁用/启用设备设置权限的功能,那么该设备可能在Android> 23上运行。您可以参考此处:https://developer.android.com/training/permissions/requesting.html –

+0

权限是在第一时间授予的(默认行为为22及以下),但用户稍后会从三星设备的设备设置中禁用它。我应该如何处理这种情况?可能b有某种检查异常吗? –

0
Try this, 

private Context mContext=YourActivity.this; 

private static final int REQUEST = 112; 

if (Build.VERSION.SDK_INT >= 23) { 
    String[] PERMISSIONS = {android.Manifest.permission.CAMERA}; 
    if (!hasPermissions(mContext, PERMISSIONS)) { 
     ActivityCompat.requestPermissions((Activity) mContext, PERMISSIONS, REQUEST); 
    } else { 
     showCameraActivityForResult(activity); 
    } 
} else { 
    showCameraActivityForResult(activity); 
} 

获取权限结果

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode) { 
     case REQUEST: { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       showCameraActivityForResult(activity); 
      } else { 
       Toast.makeText(mContext, "The app was not allowed to write in your storage", Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
} 

的棉花糖

private static boolean hasPermissions(Context context, String... permissions) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
     for (String permission : permissions) { 
      if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

清单检查权限

<uses-permission android:name="android.permission.CAMERA" /> 

OR:

if (Build.VERSION.SDK_INT >= 23) 
{ 
    Log.e("Permission State",ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA)+""); 

    // Here, thisActivity is the current activity 
    if (ActivityCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) 
    { 
     showCameraActivityForResult(activity); 
    } 
    else { 
     // No explanation needed, we can request the permission. 
     ActivityCompat.requestPermissions(activity, new String[]{android.Manifest.permission.CAMERA}, Constant.MY_PERMISSIONS_REQUEST_CAMERA); 
    } 
}else{ 
    showCameraActivityForResult(activity); 
} 
+0

我需要检查下面的api 22.我该如何检查?对于22岁以下,我不能使用checkSelfPermission。我需要一种方法来了解由于用户限制或其他原因无法使用相机。 –

+0

无需检查22以下的权限,只需在清单文件中添加您的许可 – user2025187

+0

第一次授予权限(默认行为为22及以下),但用户稍后会从三星设备的设备设置中禁用它。我应该如何处理这种情况?可能b有某种检查异常吗? –

0

checkSelfPermission可用上述SDK 23

我们可以检查许可是否可用使用包管理器

public static Boolean checkpermissions(Activity activity) { 
    PackageManager mPackageManager = activity.getPackageManager(); 
    int hasPermStorage = mPackageManager.checkPermission(android.Manifest.permission.CAMERA, activity.getPackageName()); 

    if (hasPermStorage != PackageManager.PERMISSION_GRANTED) { 
    // do stuff 
    // Toast.makeText(getApplicationContext(), "No permission", Toast.LENGTH_LONG).show(); 
    return false; 
    } else if (hasPermStorage == PackageManager.PERMISSION_GRANTED) { 
    // do stuff 
    // Toast.makeText(getApplicationContext(), "Has permission", Toast.LENGTH_LONG).show(); 
    return true; 
    } else { 
    return false; 
    }