android - 即使 Target Sdk 设置为 28,在 Android 10 上存储位图时应用程序崩溃?

标签 android xamarin xamarin.android mediastore

我通过存储在 MediaStore 中将位图附加到 Imageview。它在 android 10 以下的所有设备中都可以正常工作,但是在像素中发生崩溃时。我的 android id 针对 sdk 28

try {
                Bitmap thePic = MediaStore.Images.Media.GetBitmap(ContentResolver, croppedPicUri);
                if(thePic != null){
                    imgProfileIcon.SetImageBitmap(thePic);

                //mediaStorageDir = Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDcim);
                mediaStorageDir = GetExternalFilesDir(Environment.DirectoryPictures);
                if (!mediaStorageDir.Exists())
                {
                    mediaStorageDir.Mkdirs();
                }


                // Create a media file name
                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").Format(new Java.Util.Date());
                sendFile = new File(mediaStorageDir.Path + File.Separator + "IMG_" + timeStamp + ".png");

                String path_ = MediaStore.Images.Media.InsertImage(this.ContentResolver, thePic, "Title", null);
                if (path_ != null){
                    Uri tempUri = Uri.Parse(path_);
                    path = GetPathToImage(tempUri);
                }
                }
            } catch (Exception ex) {
                Toast.MakeText(this, "Bundle extras : " + ex.Message, ToastLength.Short).Show();
            }

{Java.Lang.IllegalStateException:无法构建唯一文件:/storage/emulated/0/Pictures Title image/jpeg
在 Java.Interop.JniEnvironment+StaticMethods.CallStaticObjectMethod(Java.Interop.JniObjectReference 类型,Java.Interop.JniMethodInfo 方法,Java.Interop.JniArgumentValue* args)[0x00069] 在 <205bc242eb64455b94479843fca3eeb7>:0
在 <205bc242eb64455b94479843fca3eeb7> 中的 Java.Interop.JniPeerMembers+JniStaticMethods.InvokeObjectMethod(System.String encodedMember,Java.Interop.JniArgumentValue* 参数)[0x00018]:0
在 Android.Provider.MediaStore+Images+Media.InsertImage (Android.Content.ContentResolver cr, Android.Graphics.Bitmap source, System.String title, System.String description) [0x0008d] in <072ebd6d3ae947ac8b3980f8fd1aeee1>:0
在 D:\EventApp\EventApp\Activity\ProfileListActivity.cs:1310 中的 EventApp.ProfileListActivity.OnActivityResult (System.Int32 requestCode, Android.App.Result resultCode, Android.Content.Intent 数据) [0x00200]
--- 托管 Java.Lang.IllegalStateException 堆栈跟踪结束 ---
java.lang.IllegalStateException:无法构建唯一文件:/storage/emulated/0/Pictures Title image/jpeg
在 android.os.Parcel.createException(Parcel.java:2079)
在 android.os.Parcel.readException(Parcel.java:2039)
在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
在 android.content.ContentProviderProxy.insert(ContentProviderNative.java:481)
在 android.content.ContentResolver.insert(ContentResolver.java:1828)
在 android.provider.MediaStore.createPending(MediaStore.java:616)
在 android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:1771)

最佳答案

让我们考虑一下:

MediaStore.Images.Media.insertImage(ContentResolver cr, Bitmap source, String title, String description)

让我们把它应用到一个真实的例子中:
MediaStore.Images.Media.insertImage(context.getContentResolver(), imageToSave, "ThisIsImageTitleString", null);

您会注意到这可以安全地将任何类型的位图保存在内存中。
但是输出位图名称如何?

第一次:

ThisIsImageTitleString



第二次:

ThisIsImageTitleString(2)



...

第 32 次:

ThisIsImageTitleString(32)



第 33 次:

java.lang.IllegalStateException: Failed to build unique file: /storage/emulated/0/Pictures ThisIsImageTitleString image/jpeg



简单的解决方案:添加 时间戳 .

将其声明为常量(根据您的需要静态或非静态)
static Date currentTime;

然后将 MediaStore 方式以保存位图更改为:
MediaStore.Images.Media.insertImage(context.getContentResolver(), imageToSave, "ThisIsImageTitleString" + " - " + (currentTime = Calendar.getInstance().getTime()), null);

请注意: (currentTime = Calendar.getInstance().getTime())

关于android - 即使 Target Sdk 设置为 28,在 Android 10 上存储位图时应用程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58487750/

相关文章:

android - session Android 应用程序,如网络应用程序

android - 有什么方法可以检查用户是否实际选中了该复选框

android - Jetpack compose - 当应用程序返回前台时如何刷新屏幕

android - 是否可以从手机构建 APK?

Azure 自定义视觉服务紧凑域

xamarin.ios - 使用 PCL 多次定义类型的奇怪错误

visual-studio-2010 - Visual Studio 2010 可移植类库不允许我更改目标

android - 在哪里可以访问默认的 AppCompat 样式主题?

xamarin - 反序列化 Google-services.json 文件时出错

xamarin - 带有自定义标签菜单的底部标签栏