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