I am trying to request user permissions at runtime. The API is 23 and I want to pick up an image from the phone's gallery. Following some snippets, this is the code I have so far:
In the onCreate()
of the Activity I check:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
PackageManager.PERMISSION_GRANTED) {
imageUploader5.setEnabled(true);
ActivityCompat.requestPermissions(this, new String[]
{ Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
}
Then I override:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == 0) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
imageUploader5.setEnabled(true);
}
}
}
But I still cannot make the app to run on the AVD.
EDIT: Permissions in the manifest:
<uses-permission-sdk-23 android:name="android.permission.CAMERA" />
<uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission-sdk-23 android:name="android.permission.READ_EXTERNAL_STORAGE" />
By how you structured your if
state you will ask for user permissions only if they are already granted. Add an else
as follow:
// Enable if permission granted
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) ==
PackageManager.PERMISSION_GRANTED) {
imageUploader5.setEnabled(true);
}
// Else ask for permission
else {
ActivityCompat.requestPermissions(this, new String[]
{ Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
}
Edit
Generalize your user-permission
in the manifest so it can be used by different and future API levels:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
defaultConfig {
applicationId "com.myapp"
minSdkVersion 11
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
will just do it. note the
targetSdkVersion 22
you check permission as below
public static int REQUEST_STORAGE_PERMISSION = 122;
if (checkStoragePermission()) {
imageUploader5.setEnabled(true);
} else {
requestStoragePermission();
}
private boolean checkStoragePermission() {
return ActivityCompat.checkSelfPermission(RegisterActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
private void requestStoragePermission() {
ActivityCompat.requestPermissions(RegisterActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_STORAGE_PERMISSION);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_STORAGE_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
imageUploader5.setEnabled(true);
} else {
imageUploader5.setEnabled(false);
}
}
}
The Permission Class link below:-
https://jeeteshsurana.blogspot.com/2017/07/permission-class-pass-activity.html
create Sperate class and call
PermissionClass.checkAndRequestPermissions(this);
// if fragment then replace this to getActivity()
it automatically getting permission