如何解决我的 Android 应用在分享 gif 时崩溃
我创建了一个 meme 共享应用程序,它在 Image 视图中从 Reddit 中获取随机 meme,用户可以选择通过其他应用程序共享 meme。共享功能适用于 jpg、png 等文件类型,gif 除外。 gif 出现在 imageView 中,但只要我点击分享按钮,应用就会崩溃。这只发生在 gif 文件类型中
我的分享功能代码。函数名称是shareMeme。
private void shareImageandText(Bitmap bitmap) {
Uri uri = getmageToShare(bitmap);
Intent intent = new Intent(Intent.ACTION_SEND);
// putting uri of image to be shared
intent.putExtra(Intent.EXTRA_STREAM,uri);
// adding text to share
intent.putExtra(Intent.EXTRA_TEXT,"Hey! Checkout this cool meme on Reddit");
// Add subject Here
intent.putExtra(Intent.EXTRA_SUBJECT,"Try Meme Lelo");
// setting type to image
intent.setType("image/*");
// calling startactivity() to share
startActivity(Intent.createChooser(intent,"Share Via"));
}
// Retrieving the url to share
private Uri getmageToShare(Bitmap bitmap) {
File imagefolder = new File(getCacheDir(),"images");
Uri uri = null;
try {
imagefolder.mkdirs();
File file = new File(imagefolder,"shared_image.png");
FileOutputStream outputStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG,90,outputStream);
outputStream.flush();
outputStream.close();
uri = FileProvider.getUriForFile(this,"com.akki.memelelo.fileprovider",file);
} catch (Exception e) {
Toast.makeText(this,"" + e.getMessage(),Toast.LENGTH_LONG).show();
}
return uri;
}
public void shareMeme(View view) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) memeImageView.getDrawable();
Bitmap bitmap = bitmapDrawable.getBitmap();
shareImageandText(bitmap);
}
Logcat - 红线错误消息
2021-07-02 15:04:26.238 9953-9953/com.akki.memelelo E/AndroidRuntime:致命异常:main 进程:com.akki.memelelo,PID:9953 java.lang.IllegalStateException: 无法执行 android:onClick 的方法 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414) 在 android.view.View.performClick(View.java:7448) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) 在 android.view.View.performClickInternal(View.java:7425) 在 android.view.View.access$3600(View.java:810) 在 android.view.View$PerformClick.run(View.java:28305) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Method.invoke(Native Method) 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 在 android.view.View.performClick(View.java:7448) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) 在 android.view.View.performClickInternal(View.java:7425) 在 android.view.View.access$3600(View.java:810) 在 android.view.View$PerformClick.run(View.java:28305) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 引起:java.lang.ClassCastException:com.bumptech.glide.load.resource.gif.GifDrawable 不能转换为 android.graphics.drawable.BitmapDrawable 在 com.akki.memelelo.MainActivity.shareMeme(MainActivity.java:148) 在 java.lang.reflect.Method.invoke(Native Method) 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) 在 android.view.View.performClick(View.java:7448) 在 com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) 在 android.view.View.performClickInternal(View.java:7425) 在 android.view.View.access$3600(View.java:810) 在 android.view.View$PerformClick.run(View.java:28305) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2021-07-02 15:04:28.797 7519-7836/com.google.android.googlequicksearchbox E/sb.v.u.LiteSuggestSourc:设备上的精简版提示模型加载错误。
2021-07-02 15:04:29.025 7519-7745/com.google.android.googlequicksearchbox E/MDD:DownloadProgressMonitor:找不到 uri 的文件组:android://com.google.android.googlequicksearchbox /files/sharedminusonemodule/shared/SharedMinusOneData.pb.tmp
2021-07-02 15:06:49.119 207-211/? E/android.system.suspend@1.0-service:打开内核唤醒锁统计信息时出错:wakeup34:权限被拒绝 2021-07-02 15:06:49.125 207-211/? E/android.system.suspend@1.0-service:打开内核唤醒锁统计信息时出错:wakeup35:权限被拒绝
解决方法
BitmapDrawable bitmapDrawable = (BitmapDrawable) memeImageView.getDrawable();
在这里,您将 GifDrawable 转换为 BitmapDrawable,这会导致崩溃。 为了获取图像(作为位图对象),这是有效的,但您必须单独处理 GIF。可能检查 ImageView 中加载的内容并相应地共享内容。
要共享 GIF,请将 GIF 保存在内部/外部存储中并与以下对象共享其 URI:
"image/gif"
像这样:
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("image/gif");
Uri uri = Uri.fromFile(sharingGifFile);
shareIntent.putExtra(Intent.EXTRA_STREAM,uri);
startActivity(Intent.createChooser(shareIntent,"Share Emoji"));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。