From fbd4aef0649d830acdf689a94ded0e714187015a Mon Sep 17 00:00:00 2001 From: Olga Miller Date: Fri, 6 Jan 2017 12:32:31 +0100 Subject: [PATCH] Fixes write permission for each sdk version, improved image loading --- app/src/main/AndroidManifest.xml | 3 +- .../main/java/om/sstvencoder/CropView.java | 8 ++- .../java/om/sstvencoder/MainActivity.java | 65 +++++++++++-------- app/src/main/res/values/strings.xml | 1 + 4 files changed, 46 insertions(+), 31 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa8012d..00be8dd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,8 +3,7 @@ package="om.sstvencoder"> + android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> diff --git a/app/src/main/java/om/sstvencoder/CropView.java b/app/src/main/java/om/sstvencoder/CropView.java index 464921f..0dae2cd 100644 --- a/app/src/main/java/om/sstvencoder/CropView.java +++ b/app/src/main/java/om/sstvencoder/CropView.java @@ -177,15 +177,18 @@ public class CropView extends ImageView { mImageOK = false; mOrientation = 0; recycle(); - invalidate(); } - public void setBitmapStream(InputStream stream) throws IOException { + public void setBitmap(@NonNull InputStream stream) throws IOException { mImageOK = false; mOrientation = 0; recycle(); + loadImage(stream); + invalidate(); + } + private void loadImage(InputStream stream) throws IOException { // app6 + exif int bufferBytes = 1048576; if (!stream.markSupported()) @@ -214,7 +217,6 @@ public class CropView extends ImageView { mImageOK = true; resetInputRect(); - invalidate(); } private void recycle() { diff --git a/app/src/main/java/om/sstvencoder/MainActivity.java b/app/src/main/java/om/sstvencoder/MainActivity.java index d385a69..b5a33e9 100644 --- a/app/src/main/java/om/sstvencoder/MainActivity.java +++ b/app/src/main/java/om/sstvencoder/MainActivity.java @@ -42,7 +42,7 @@ import android.view.SubMenu; import android.widget.Toast; import java.io.File; -import java.io.FileNotFoundException; +import java.io.InputStream; import om.sstvencoder.ModeInterfaces.IModeInfo; import om.sstvencoder.TextOverlay.Label; @@ -86,8 +86,7 @@ public class MainActivity extends AppCompatActivity { uri = mSettings.getImageUri(); verbose = false; } - if (loadImage(uri, verbose)) - mSettings.setImageUri(uri); + loadImage(uri, verbose); } private Uri getImageUriFromIntent(Intent intent) { @@ -105,29 +104,39 @@ public class MainActivity extends AppCompatActivity { // Set verbose to false for any Uri that might have expired (e.g. shared from browser). private boolean loadImage(Uri uri, boolean verbose) { + ContentResolver resolver = getContentResolver(); + InputStream stream = null; if (uri != null) { + mSettings.setImageUri(uri); try { - ContentResolver resolver = getContentResolver(); - mCropView.setBitmapStream(resolver.openInputStream(uri)); - mCropView.rotateImage(getOrientation(resolver, uri)); - return true; - } catch (FileNotFoundException ex) { + stream = resolver.openInputStream(uri); + } catch (Exception ex) { // e.g. FileNotFoundException, SecurityException if (ex.getCause() instanceof ErrnoException && ((ErrnoException) ex.getCause()).errno == OsConstants.EACCES) { requestPermissions(); - } else if (verbose) { - String s = getString(R.string.load_img_err_title) + ": \n" + ex.getMessage(); - Toast.makeText(this, s, Toast.LENGTH_LONG).show(); - } - } catch (Exception ex) { - if (verbose) { - String s = Utility.createMessage(ex) + "\n\n" + uri; - showErrorMessage(getString(R.string.load_img_err_title), ex.getMessage(), s); + return false; } + showFileNotLoadedMessage(ex, verbose); } } - mCropView.setNoBitmap(); - return false; + if (stream == null) { + mCropView.setNoBitmap(); + mSettings.setImageUri(null); + return false; + } + return loadImage(stream, resolver, uri); + } + + private boolean loadImage(InputStream stream, ContentResolver resolver, Uri uri) { + try { + mCropView.setBitmap(stream); + } catch (Exception ex) { + String s = Utility.createMessage(ex) + "\n\n" + uri; + showErrorMessage(getString(R.string.load_img_err_title), ex.getMessage(), s); + return false; + } + mCropView.rotateImage(getOrientation(resolver, uri)); + return true; } private boolean isIntentActionValid(String action) { @@ -147,6 +156,15 @@ public class MainActivity extends AppCompatActivity { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } + private void showFileNotLoadedMessage(Exception ex, boolean verbose) { + String s; + if (verbose) + s = getString(R.string.load_img_err_title) + ": \n" + ex.getMessage(); + else + s = getString(R.string.message_prev_img_not_loaded); + Toast.makeText(this, s, Toast.LENGTH_LONG).show(); + } + private void showErrorMessage(final String title, final String shortText, final String longText) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(title); @@ -280,18 +298,13 @@ public class MainActivity extends AppCompatActivity { case REQUEST_IMAGE_CAPTURE: if (resultCode == RESULT_OK) { Uri uri = Uri.fromFile(mFile); - if (loadImage(uri, true)) { - mSettings.setImageUri(uri); + if (loadImage(uri, true)) addImageToGallery(uri); - } } break; case REQUEST_PICK_IMAGE: - if (resultCode == RESULT_OK && data != null) { - Uri uri = data.getData(); - if (loadImage(uri, true)) - mSettings.setImageUri(uri); - } + if (resultCode == RESULT_OK && data != null) + loadImage(data.getData(), true); break; default: super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d6ffd1..2ef6a1d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,7 @@ Image loading error Image orientation error Unsupported content. + Previous image could not be loaded. Send Email OK SSTV Encoder - Bug Report