Improved permission requests

for Android 6.0 (API level 23) or later
This commit is contained in:
Olga Miller 2017-01-06 15:33:10 +01:00
parent fbdff4d944
commit 6cc4faf3c4
2 changed files with 88 additions and 25 deletions

View file

@ -49,9 +49,11 @@ import om.sstvencoder.TextOverlay.Label;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
private static final String CLASS_NAME = "ClassName"; private static final String CLASS_NAME = "ClassName";
private static final int REQUEST_PERMISSION = 1; private static final int REQUEST_LOAD_IMAGE_PERMISSION = 1;
private static final int REQUEST_PICK_IMAGE = 2; private static final int REQUEST_SAVE_WAVE_PERMISSION = 2;
private static final int REQUEST_IMAGE_CAPTURE = 3; private static final int REQUEST_IMAGE_CAPTURE_PERMISSION = 3;
private static final int REQUEST_PICK_IMAGE = 11;
private static final int REQUEST_IMAGE_CAPTURE = 12;
private Settings mSettings; private Settings mSettings;
private TextOverlayTemplate mTextOverlayTemplate; private TextOverlayTemplate mTextOverlayTemplate;
private CropView mCropView; private CropView mCropView;
@ -112,9 +114,8 @@ public class MainActivity extends AppCompatActivity {
try { try {
stream = resolver.openInputStream(uri); stream = resolver.openInputStream(uri);
} catch (Exception ex) { // e.g. FileNotFoundException, SecurityException } catch (Exception ex) { // e.g. FileNotFoundException, SecurityException
if (ex.getCause() instanceof ErrnoException if (isPermissionException(ex) && needsRequestReadPermission()) {
&& ((ErrnoException) ex.getCause()).errno == OsConstants.EACCES) { requestReadPermission(REQUEST_LOAD_IMAGE_PERMISSION);
requestPermissions();
return false; return false;
} }
showFileNotLoadedMessage(ex, verbose); showFileNotLoadedMessage(ex, verbose);
@ -148,24 +149,70 @@ public class MainActivity extends AppCompatActivity {
return type != null && type.startsWith("image/"); return type != null && type.startsWith("image/");
} }
@TargetApi(Build.VERSION_CODES.JELLY_BEAN) @TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void requestPermissions() { private boolean isPermissionException(Exception ex) {
if (Build.VERSION_CODES.JELLY_BEAN > Build.VERSION.SDK_INT) return ex.getCause() instanceof ErrnoException
return; && ((ErrnoException) ex.getCause()).errno == OsConstants.EACCES;
int permissionState = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permissionState != PackageManager.PERMISSION_GRANTED) {
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
ActivityCompat.requestPermissions(this, permissions, REQUEST_PERMISSION);
} }
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private boolean needsRequestReadPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
return false;
String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
int state = ContextCompat.checkSelfPermission(this, permission);
return state != PackageManager.PERMISSION_GRANTED;
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private boolean needsRequestWritePermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
return false;
String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
int state = ContextCompat.checkSelfPermission(this, permission);
return state != PackageManager.PERMISSION_GRANTED;
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void requestReadPermission(int requestCode) {
String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
ActivityCompat.requestPermissions(this, permissions, requestCode);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void requestWritePermission(int requestCode) {
String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE};
ActivityCompat.requestPermissions(this, permissions, requestCode);
} }
@Override @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { public void onRequestPermissionsResult(int requestCode,
if (requestCode == REQUEST_PERMISSION @NonNull String permissions[],
&& grantResults.length > 0 @NonNull int[] grantResults) {
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) { switch (requestCode) {
case REQUEST_LOAD_IMAGE_PERMISSION:
if (permissionGranted(grantResults))
loadImage(mSettings.getImageUri(), false); loadImage(mSettings.getImageUri(), false);
else {
mCropView.setNoBitmap();
mSettings.setImageUri(null);
} }
break;
case REQUEST_IMAGE_CAPTURE_PERMISSION:
if (permissionGranted(grantResults))
dispatchTakePictureIntent();
break;
case REQUEST_SAVE_WAVE_PERMISSION:
if (permissionGranted(grantResults))
save();
break;
default:
break;
}
}
private boolean permissionGranted(@NonNull int[] grantResults) {
return grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
} }
private void showFileNotLoadedMessage(Exception ex, boolean verbose) { private void showFileNotLoadedMessage(Exception ex, boolean verbose) {
@ -243,9 +290,12 @@ public class MainActivity extends AppCompatActivity {
dispatchPickPictureIntent(); dispatchPickPictureIntent();
return true; return true;
case R.id.action_take_picture: case R.id.action_take_picture:
dispatchTakePictureIntent(); takePicture();
return true; return true;
case R.id.action_save_wave: case R.id.action_save_wave:
if (needsRequestWritePermission())
requestWritePermission(REQUEST_SAVE_WAVE_PERMISSION);
else
save(); save();
return true; return true;
case R.id.action_play: case R.id.action_play:
@ -270,6 +320,22 @@ public class MainActivity extends AppCompatActivity {
} }
} }
private void takePicture() {
if (!hasCamera()) {
Toast.makeText(this, getString(R.string.message_no_camera), Toast.LENGTH_LONG).show();
return;
}
if (needsRequestWritePermission())
requestWritePermission(REQUEST_IMAGE_CAPTURE_PERMISSION);
else
dispatchTakePictureIntent();
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private boolean hasCamera() {
return getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
}
public void startEditTextActivity(@NonNull Label label) { public void startEditTextActivity(@NonNull Label label) {
Intent intent = new Intent(this, EditTextActivity.class); Intent intent = new Intent(this, EditTextActivity.class);
intent.putExtra(EditTextActivity.EXTRA, label); intent.putExtra(EditTextActivity.EXTRA, label);
@ -277,10 +343,6 @@ public class MainActivity extends AppCompatActivity {
} }
private void dispatchTakePictureIntent() { private void dispatchTakePictureIntent() {
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) {
Toast.makeText(this, "Device has no camera.", Toast.LENGTH_LONG).show();
return;
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) { if (intent.resolveActivity(getPackageManager()) != null) {
mFile = Utility.createImageFilePath(); mFile = Utility.createImageFilePath();

View file

@ -28,6 +28,7 @@
<string name="load_img_orientation_err_title">Image orientation error</string> <string name="load_img_orientation_err_title">Image orientation error</string>
<string name="load_img_err_txt_unsupported">Unsupported content.</string> <string name="load_img_err_txt_unsupported">Unsupported content.</string>
<string name="message_prev_img_not_loaded">Previous image could not be loaded.</string> <string name="message_prev_img_not_loaded">Previous image could not be loaded.</string>
<string name="message_no_camera">Device has no camera.</string>
<string name="btn_send_email">Send Email</string> <string name="btn_send_email">Send Email</string>
<string name="btn_ok">OK</string> <string name="btn_ok">OK</string>
<string name="email_subject">SSTV Encoder - Bug Report</string> <string name="email_subject">SSTV Encoder - Bug Report</string>