diff --git a/src/org/thoughtcrime/securesms/database/AttachmentDatabase.java b/src/org/thoughtcrime/securesms/database/AttachmentDatabase.java index 4eae3ed42e..c878e7e485 100644 --- a/src/org/thoughtcrime/securesms/database/AttachmentDatabase.java +++ b/src/org/thoughtcrime/securesms/database/AttachmentDatabase.java @@ -57,6 +57,7 @@ import org.thoughtcrime.securesms.util.Base64; import org.thoughtcrime.securesms.util.BitmapDecodingException; import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.JsonUtils; +import org.thoughtcrime.securesms.util.MediaMetadataRetrieverUtil; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.MediaUtil.ThumbnailData; import org.thoughtcrime.securesms.util.StorageUtil; @@ -1082,7 +1083,7 @@ public class AttachmentDatabase extends Database { if (dataSource == null) return null; MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setDataSource(dataSource); + MediaMetadataRetrieverUtil.setDataSource(retriever, dataSource); Bitmap bitmap = retriever.getFrameAtTime(1000); diff --git a/src/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java b/src/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java index ec806b56d9..fb75e768a7 100644 --- a/src/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java +++ b/src/org/thoughtcrime/securesms/jobs/AttachmentUploadJob.java @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.service.GenericForegroundService; import org.thoughtcrime.securesms.service.NotificationController; +import org.thoughtcrime.securesms.util.MediaMetadataRetrieverUtil; import org.thoughtcrime.securesms.util.MediaUtil; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.SignalServiceMessageSender; @@ -174,7 +175,7 @@ public final class AttachmentUploadJob extends BaseJob { if (dataSource == null) return null; MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - retriever.setDataSource(dataSource); + MediaMetadataRetrieverUtil.setDataSource(retriever, dataSource); Bitmap bitmap = retriever.getFrameAtTime(1000); diff --git a/src/org/thoughtcrime/securesms/util/MediaMetadataRetrieverUtil.java b/src/org/thoughtcrime/securesms/util/MediaMetadataRetrieverUtil.java new file mode 100644 index 0000000000..04be39b9f5 --- /dev/null +++ b/src/org/thoughtcrime/securesms/util/MediaMetadataRetrieverUtil.java @@ -0,0 +1,30 @@ +package org.thoughtcrime.securesms.util; + +import android.media.MediaDataSource; +import android.media.MediaMetadataRetriever; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + +import java.io.IOException; + +public final class MediaMetadataRetrieverUtil { + + private MediaMetadataRetrieverUtil() {} + + /** + * {@link MediaMetadataRetriever#setDataSource(MediaDataSource)} tends to crash in native code on + * specific devices, so this just a wrapper to convert that into an {@link IOException}. + */ + @RequiresApi(23) + public static void setDataSource(@NonNull MediaMetadataRetriever retriever, + @NonNull MediaDataSource dataSource) + throws IOException + { + try { + retriever.setDataSource(dataSource); + } catch (Exception e) { + throw new IOException(e); + } + } +} diff --git a/src/org/thoughtcrime/securesms/util/MediaUtil.java b/src/org/thoughtcrime/securesms/util/MediaUtil.java index 588e69a58d..6780cdf499 100644 --- a/src/org/thoughtcrime/securesms/util/MediaUtil.java +++ b/src/org/thoughtcrime/securesms/util/MediaUtil.java @@ -300,9 +300,9 @@ public class MediaUtil { MediaDataSource mediaDataSource = BlobProvider.getInstance().getMediaDataSource(context, uri); MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); - mediaMetadataRetriever.setDataSource(mediaDataSource); + MediaMetadataRetrieverUtil.setDataSource(mediaMetadataRetriever, mediaDataSource); return mediaMetadataRetriever.getFrameAtTime(1000); - } catch (Exception e) { // XXX Some devices are hitting a native crash in setDataSource. Not much we can do. + } catch (IOException e) { Log.w(TAG, "failed to get thumbnail for video blob uri: " + uri, e); return null; }