我的 android 应用程序在共享 gif 时崩溃

Posted

技术标签:

【中文标题】我的 android 应用程序在共享 gif 时崩溃【英文标题】:My android app crashes while sharing a gif 【发布时间】:2021-09-12 22:24:39 【问题描述】:

我创建了一个 meme 共享应用程序,该应用程序在图像视图中从 Reddit 获取随机 meme,并且用户可以选择通过其他应用程序共享 meme。共享功能适用于除 gif 以外的 jpg、png 等文件类型。 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(本机方法) 在 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(本机方法) 在 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(本机方法) 在 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(本机方法) 在 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(本机方法) 在 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:设备上的 lite 建议模型加载错误。

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:权限被拒绝

【问题讨论】:

请分享到 logcat 以防崩溃 另外,当您发送内容到另一个应用程序时,总是使用具体的 MIME 类型。您使用的是通配符,因此接收应用不知道这是什么类型的图像。 所以您将 GIF 作为位图并将其压缩为 PNG? @Darkman,我想我正在这样做。我是 Android 开发的初学者,我在互联网的帮助下编写了这段代码。你能建议我做些改变吗? @CommonsWare,我是 Android 开发的初学者。你能建议我怎么做吗? 【参考方案1】:
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"));

【讨论】:

以上是关于我的 android 应用程序在共享 gif 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

通过 UIActivityViewController 共享的 Gif 在(至少)fb、twitter、notes 中以静态图像的形式出现

如何与 iOS 共享文件?

在android中播放下载的Gif图像

Android中的GIF监听器

记录/捕获 Android 应用程序行为 - 转换为动画 GIF

如何在 react-native android 应用程序中显示 GIF?