Loading app/src/main/java/net/fabiszewski/ulogger/ImageHelper.java +45 −32 Original line number Diff line number Diff line Loading @@ -18,10 +18,10 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.media.MediaScannerConnection; import android.media.ThumbnailUtils; import android.net.Uri; import android.os.Build; import android.os.ParcelFileDescriptor; import android.provider.MediaStore; import android.provider.OpenableColumns; import android.util.Log; Loading @@ -40,13 +40,9 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import static android.content.ContentResolver.SCHEME_CONTENT; import static android.content.ContentResolver.SCHEME_FILE; class ImageHelper { private static final String TAG = ImageHelper.class.getSimpleName(); private static final String MEDIA_ORIENTATION = "orientation"; private static final String JPEG_MIME = "image/jpg"; private static final int ORIENTATION_90 = 90; private static final int ORIENTATION_180 = 180; private static final int ORIENTATION_270 = 270; Loading Loading @@ -148,22 +144,20 @@ class ImageHelper { */ static Uri createImageUri(@NonNull Context context) { ContentValues values = new ContentValues(); String title = getUniqueTitle(context); long timeMillis = System.currentTimeMillis(); values.put(MediaStore.Images.Media.TITLE, title); values.put(MediaStore.Images.Media.DISPLAY_NAME, title); values.put(MediaStore.Images.Media.MIME_TYPE, JPEG_MIME); values.put(MediaStore.Images.Media.TITLE, getUniqueTitle(context)); values.put(MediaStore.Images.Media.DATE_ADDED, timeMillis / 1000); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { values.put(MediaStore.Images.Media.DATE_TAKEN, timeMillis); } Uri collection; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { values.put(MediaStore.Images.Media.DATE_TAKEN, timeMillis); values.put(MediaStore.Images.Media.IS_PENDING, 0); collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY); } else { collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } return context.getContentResolver().insert(collection, values); Uri imageUri = context.getContentResolver().insert(collection, values); if (Logger.DEBUG) { Log.d(TAG, "[createImageUri: " + imageUri + "]" ); } return imageUri; } /** Loading Loading @@ -238,26 +232,32 @@ class ImageHelper { * Get file size * @param context Context * @param uri File URI * @return Size or zero if not known * @return Size or -1 if not known */ static long getFileSize(@NonNull Context context, @NonNull Uri uri) { long fileSize = 0; final String scheme = uri.getScheme(); if (SCHEME_CONTENT.equals(scheme)) { try (Cursor cursor = context.getContentResolver() .query(uri, null, null, null, null)) { if (cursor != null) { int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE); cursor.moveToFirst(); fileSize = cursor.getLong(sizeIndex); final ContentResolver cr = context.getContentResolver(); String[] projection = {OpenableColumns.SIZE}; try (Cursor cursor = cr.query(uri, projection, null, null, null)) { if (cursor != null && cursor.moveToFirst()) { long size = cursor.getInt(0); if (size > 0) { if (Logger.DEBUG) { Log.d(TAG, "[getFileSize (db): " + size + "]" ); } return size; } } } else if (SCHEME_FILE.equals(scheme) && uri.getPath() != null) { File file = new File(uri.getPath()); fileSize = file.length(); } catch (Exception ignored) { } try (ParcelFileDescriptor parcelFileDescriptor = cr.openFileDescriptor(uri, "r")) { if (parcelFileDescriptor != null) { long size = parcelFileDescriptor.getStatSize(); if (Logger.DEBUG) { Log.d(TAG, "[getFileSize (fd): " + size + "]" ); } return size; } if (Logger.DEBUG) { Log.d(TAG, "[getFileSize (" + scheme + "): " + fileSize + "]" ); } return fileSize; } catch (IOException ignored) { } return -1; } /** Loading @@ -273,6 +273,10 @@ class ImageHelper { if (fileMime == null) { String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri.toString()); fileMime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension.toLowerCase(Locale.ROOT)); if (Logger.DEBUG) { Log.d(TAG, "[getFileMime (ext): " + fileMime + "]" ); } } else { fileMime = fileMime.replace("jpg", "jpeg"); if (Logger.DEBUG) { Log.d(TAG, "[getFileMime (cr): " + fileMime + "]" ); } } return fileMime; } Loading Loading @@ -424,9 +428,14 @@ class ImageHelper { * @param uri Image URI */ static void galleryAdd(@NonNull Context context, @NonNull Uri uri) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, getUniqueTitle(context)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { values.put(MediaStore.Images.Media.IS_PENDING, 0); } ContentResolver cr = context.getContentResolver(); String mime = cr.getType(uri); MediaScannerConnection.scanFile(context, new String[] {uri.getPath()}, new String[] {mime}, null); if (Logger.DEBUG) { Log.d(TAG, "[update " + uri + "]"); } cr.update(uri, values, null, null); } /** Loading @@ -435,6 +444,10 @@ class ImageHelper { * @param uri URI */ static void getPersistablePermission(@NonNull Context context, @NonNull Uri uri) { try { context.getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (SecurityException e) { if (Logger.DEBUG) { Log.d(TAG, "[getPersistablePermission failed for " + uri + "]"); } } } } app/src/main/java/net/fabiszewski/ulogger/WaypointFragment.java +7 −5 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ import android.graphics.Bitmap; import android.location.Location; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; Loading @@ -42,6 +41,9 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import static android.app.Activity.RESULT_OK; import static android.content.Intent.EXTRA_LOCAL_ONLY; import static android.content.Intent.EXTRA_MIME_TYPES; import static android.content.Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION; public class WaypointFragment extends Fragment implements LoggerTask.LoggerTaskCallback, ImageTask.ImageTaskCallback { Loading Loading @@ -268,10 +270,8 @@ public class WaypointFragment extends Fragment implements LoggerTask.LoggerTaskC if (takePictureIntent.resolveActivity(requireContext().getPackageManager()) != null) { photoUri = ImageHelper.createImageUri(requireContext()); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); int flags = Intent.FLAG_GRANT_WRITE_URI_PERMISSION|Intent.FLAG_GRANT_READ_URI_PERMISSION; if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { int flags = FLAG_GRANT_WRITE_URI_PERMISSION|FLAG_GRANT_READ_URI_PERMISSION|FLAG_GRANT_PERSISTABLE_URI_PERMISSION; takePictureIntent.addFlags(flags); } startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } Loading Loading @@ -384,6 +384,8 @@ public class WaypointFragment extends Fragment implements LoggerTask.LoggerTaskC String[] mimeTypes = { "image/jpeg", "image/gif", "image/png", "image/x-ms-bmp" }; intent.putExtra(EXTRA_MIME_TYPES, mimeTypes); intent.putExtra(EXTRA_LOCAL_ONLY, true); int flags = FLAG_GRANT_READ_URI_PERMISSION|FLAG_GRANT_PERSISTABLE_URI_PERMISSION; intent.addFlags(flags); try { startActivityForResult(intent, REQUEST_IMAGE_OPEN); } catch (ActivityNotFoundException e) { Loading app/src/main/java/net/fabiszewski/ulogger/WebHelper.java +1 −1 Original line number Diff line number Diff line Loading @@ -308,7 +308,7 @@ class WebHelper { return; } long fileSize = ImageHelper.getFileSize(context, uri); if (fileSize > UPLOAD_SIZE_MAX || fileSize == 0) { if (fileSize > UPLOAD_SIZE_MAX || fileSize <= 0) { if (Logger.DEBUG) { Log.d(TAG, "[Skipping file, wrong size: " + fileSize + "]"); } return; } Loading Loading
app/src/main/java/net/fabiszewski/ulogger/ImageHelper.java +45 −32 Original line number Diff line number Diff line Loading @@ -18,10 +18,10 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.media.MediaScannerConnection; import android.media.ThumbnailUtils; import android.net.Uri; import android.os.Build; import android.os.ParcelFileDescriptor; import android.provider.MediaStore; import android.provider.OpenableColumns; import android.util.Log; Loading @@ -40,13 +40,9 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import static android.content.ContentResolver.SCHEME_CONTENT; import static android.content.ContentResolver.SCHEME_FILE; class ImageHelper { private static final String TAG = ImageHelper.class.getSimpleName(); private static final String MEDIA_ORIENTATION = "orientation"; private static final String JPEG_MIME = "image/jpg"; private static final int ORIENTATION_90 = 90; private static final int ORIENTATION_180 = 180; private static final int ORIENTATION_270 = 270; Loading Loading @@ -148,22 +144,20 @@ class ImageHelper { */ static Uri createImageUri(@NonNull Context context) { ContentValues values = new ContentValues(); String title = getUniqueTitle(context); long timeMillis = System.currentTimeMillis(); values.put(MediaStore.Images.Media.TITLE, title); values.put(MediaStore.Images.Media.DISPLAY_NAME, title); values.put(MediaStore.Images.Media.MIME_TYPE, JPEG_MIME); values.put(MediaStore.Images.Media.TITLE, getUniqueTitle(context)); values.put(MediaStore.Images.Media.DATE_ADDED, timeMillis / 1000); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { values.put(MediaStore.Images.Media.DATE_TAKEN, timeMillis); } Uri collection; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { values.put(MediaStore.Images.Media.DATE_TAKEN, timeMillis); values.put(MediaStore.Images.Media.IS_PENDING, 0); collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY); } else { collection = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } return context.getContentResolver().insert(collection, values); Uri imageUri = context.getContentResolver().insert(collection, values); if (Logger.DEBUG) { Log.d(TAG, "[createImageUri: " + imageUri + "]" ); } return imageUri; } /** Loading Loading @@ -238,26 +232,32 @@ class ImageHelper { * Get file size * @param context Context * @param uri File URI * @return Size or zero if not known * @return Size or -1 if not known */ static long getFileSize(@NonNull Context context, @NonNull Uri uri) { long fileSize = 0; final String scheme = uri.getScheme(); if (SCHEME_CONTENT.equals(scheme)) { try (Cursor cursor = context.getContentResolver() .query(uri, null, null, null, null)) { if (cursor != null) { int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE); cursor.moveToFirst(); fileSize = cursor.getLong(sizeIndex); final ContentResolver cr = context.getContentResolver(); String[] projection = {OpenableColumns.SIZE}; try (Cursor cursor = cr.query(uri, projection, null, null, null)) { if (cursor != null && cursor.moveToFirst()) { long size = cursor.getInt(0); if (size > 0) { if (Logger.DEBUG) { Log.d(TAG, "[getFileSize (db): " + size + "]" ); } return size; } } } else if (SCHEME_FILE.equals(scheme) && uri.getPath() != null) { File file = new File(uri.getPath()); fileSize = file.length(); } catch (Exception ignored) { } try (ParcelFileDescriptor parcelFileDescriptor = cr.openFileDescriptor(uri, "r")) { if (parcelFileDescriptor != null) { long size = parcelFileDescriptor.getStatSize(); if (Logger.DEBUG) { Log.d(TAG, "[getFileSize (fd): " + size + "]" ); } return size; } if (Logger.DEBUG) { Log.d(TAG, "[getFileSize (" + scheme + "): " + fileSize + "]" ); } return fileSize; } catch (IOException ignored) { } return -1; } /** Loading @@ -273,6 +273,10 @@ class ImageHelper { if (fileMime == null) { String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri.toString()); fileMime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension.toLowerCase(Locale.ROOT)); if (Logger.DEBUG) { Log.d(TAG, "[getFileMime (ext): " + fileMime + "]" ); } } else { fileMime = fileMime.replace("jpg", "jpeg"); if (Logger.DEBUG) { Log.d(TAG, "[getFileMime (cr): " + fileMime + "]" ); } } return fileMime; } Loading Loading @@ -424,9 +428,14 @@ class ImageHelper { * @param uri Image URI */ static void galleryAdd(@NonNull Context context, @NonNull Uri uri) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DISPLAY_NAME, getUniqueTitle(context)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { values.put(MediaStore.Images.Media.IS_PENDING, 0); } ContentResolver cr = context.getContentResolver(); String mime = cr.getType(uri); MediaScannerConnection.scanFile(context, new String[] {uri.getPath()}, new String[] {mime}, null); if (Logger.DEBUG) { Log.d(TAG, "[update " + uri + "]"); } cr.update(uri, values, null, null); } /** Loading @@ -435,6 +444,10 @@ class ImageHelper { * @param uri URI */ static void getPersistablePermission(@NonNull Context context, @NonNull Uri uri) { try { context.getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (SecurityException e) { if (Logger.DEBUG) { Log.d(TAG, "[getPersistablePermission failed for " + uri + "]"); } } } }
app/src/main/java/net/fabiszewski/ulogger/WaypointFragment.java +7 −5 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ import android.graphics.Bitmap; import android.location.Location; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; Loading @@ -42,6 +41,9 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import static android.app.Activity.RESULT_OK; import static android.content.Intent.EXTRA_LOCAL_ONLY; import static android.content.Intent.EXTRA_MIME_TYPES; import static android.content.Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION; public class WaypointFragment extends Fragment implements LoggerTask.LoggerTaskCallback, ImageTask.ImageTaskCallback { Loading Loading @@ -268,10 +270,8 @@ public class WaypointFragment extends Fragment implements LoggerTask.LoggerTaskC if (takePictureIntent.resolveActivity(requireContext().getPackageManager()) != null) { photoUri = ImageHelper.createImageUri(requireContext()); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); int flags = Intent.FLAG_GRANT_WRITE_URI_PERMISSION|Intent.FLAG_GRANT_READ_URI_PERMISSION; if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { int flags = FLAG_GRANT_WRITE_URI_PERMISSION|FLAG_GRANT_READ_URI_PERMISSION|FLAG_GRANT_PERSISTABLE_URI_PERMISSION; takePictureIntent.addFlags(flags); } startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } Loading Loading @@ -384,6 +384,8 @@ public class WaypointFragment extends Fragment implements LoggerTask.LoggerTaskC String[] mimeTypes = { "image/jpeg", "image/gif", "image/png", "image/x-ms-bmp" }; intent.putExtra(EXTRA_MIME_TYPES, mimeTypes); intent.putExtra(EXTRA_LOCAL_ONLY, true); int flags = FLAG_GRANT_READ_URI_PERMISSION|FLAG_GRANT_PERSISTABLE_URI_PERMISSION; intent.addFlags(flags); try { startActivityForResult(intent, REQUEST_IMAGE_OPEN); } catch (ActivityNotFoundException e) { Loading
app/src/main/java/net/fabiszewski/ulogger/WebHelper.java +1 −1 Original line number Diff line number Diff line Loading @@ -308,7 +308,7 @@ class WebHelper { return; } long fileSize = ImageHelper.getFileSize(context, uri); if (fileSize > UPLOAD_SIZE_MAX || fileSize == 0) { if (fileSize > UPLOAD_SIZE_MAX || fileSize <= 0) { if (Logger.DEBUG) { Log.d(TAG, "[Skipping file, wrong size: " + fileSize + "]"); } return; } Loading