mirror of
https://github.com/olgamiller/SSTVEncoder2.git
synced 2025-12-06 06:52:01 +01:00
Improved permission requests
for Android 6.0 (API level 23) or later
This commit is contained in:
parent
fbdff4d944
commit
6cc4faf3c4
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue