Khant Thu Linn
Khant Thu Linn

Reputation: 6133

Android check camera permission in target sdk 22 or lower

I have my code like this to check camera permission.

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);
}

Problem is that I always have permission granted in 5.1 or lower. Other user also said here.

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

In some device like samsung, user can disable camera permission from device setting and as a result, when user open my app and tap on camera, it always show blank. How can I detect whether user can use camera? (it need to be different from my code since it is not working.)

Upvotes: 4

Views: 8544

Answers (4)

Dino Sunny
Dino Sunny

Reputation: 1051

checkSelfPermission is available above sdk 23.

we can check the permission is available or not using package manager

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;
  }

Upvotes: 0

Komal12
Komal12

Reputation: 3348

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);
}

get Permissions Result

@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();
            }
        }
    }
}

check permissions for marshmallow

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;
}

Manifest

<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);
}

Upvotes: 0

Amad Yus
Amad Yus

Reputation: 2866

If you use AppCompatActivity, you can use checkSelfPermission to check if permission have been granted.

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);
    }
}

Upvotes: 4

Andrew G
Andrew G

Reputation: 2614

On API 22 and below permissions are granted if specified in the manifest.

For API 23+ ContextCompat#checkSelfPermission could be of use. It "degrades" gracefully on earlier APIs and will tell you the permission is granted if it appears in the manifest. On API 23 and above it will actually check if it's granted.

It returns PackageManager.PERMISSION_GRANTED if the permission is granted.

call it in an Activity with Manifest.permission.CAMERA to avoid typos.

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

Upvotes: 1

Related Questions