简体   繁体   English

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

[英]My android app crashes while sharing a gif

I created a meme share app that takes a random meme from Reddit in Image view and the user has the option to share the meme through other apps.我创建了一个模因共享应用程序,它在图像视图中从 Reddit 中获取随机模因,用户可以选择通过其他应用程序共享模因。 The share function works good with jpg, png, etc file types except gif.共享功能适用于 jpg、png 等文件类型,gif 除外。 The gif appears in the imageView but as soon as I click the share button the app crashes . gif 出现在 imageView 中,但是一旦我单击共享按钮,应用程序就会崩溃 This only happens in the gif file type这只发生在 gif 文件类型中

My share Function code.我的分享功能代码。 The function name is shareMeme .函数名称是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 - Red Lines Error Msg Logcat - 红线错误消息

2021-07-02 15:04:26.238 9953-9953/com.akki.memelelo E/AndroidRuntime: FATAL EXCEPTION: main Process: com.akki.memelelo, PID: 9953 java.lang.IllegalStateException: Could not execute method for android:onClick at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414) at android.view.View.performClick(View.java:7448) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.Z 2021-07-02 15:04:26.238 9953-9953/com.akki.memelelo E/AndroidRuntime:致命异常:主进程: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.Z ygoteInit.main(ZygoteInit.java:947) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) at android.view.View.performClick(View.java:7448) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.lan ygoteInit.main(ZygoteInit.java:947) 引起:java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at 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) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) ) 引起:java.lan g.ClassCastException: com.bumptech.glide.load.resource.gif.GifDrawable cannot be cast to android.graphics.drawable.BitmapDrawable at com.akki.memelelo.MainActivity.shareMeme(MainActivity.java:148) at java.lang.reflect.Method.invoke(Native Method) at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) at android.view.View.performClick(View.java:7448) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view.View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run g.ClassCastException: com.bumptech.glide.load.resource.gif.GifDrawable 无法转换为 android.graphics.drawable.BitmapDrawable 在 com.akki.memelelo.MainActivity.shareMeme(MainActivity.java:148) at java.lang。 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409) at android.view.View.performClick(View.java:7448) at com.google.android 处的reflect.Method.invoke(Native Method)。 material.button.MaterialButton.performClick(MaterialButton.java:1119) at android.view.View.performClickInternal(View.java:7425) at android.view.View.access$3600(View.java:810) at android.view。 View$PerformClick.run(View.java:28305) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop (Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) (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.vuLiteSuggestSourc: On-device lite suggest model loading error. 2021-07-02 15:04:28.797 7519-7836/com.google.android.googlequicksearchbox E/sb.vuLiteSuggestSourc:设备精简版提示模型加载错误。

2021-07-02 15:04:29.025 7519-7745/com.google.android.googlequicksearchbox E/MDD: DownloadProgressMonitor: Can't find file group for uri: android://com.google.android.googlequicksearchbox/files/sharedminusonemodule/shared/SharedMinusOneData.pb.tmp 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/? 2021-07-02 15:06:49.119 207-211/? E/android.system.suspend@1.0-service: Error opening kernel wakelock stats for: wakeup34: Permission denied 2021-07-02 15:06:49.125 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: Error opening kernel wakelock stats for: wakeup35: Permission denied E/android.system.suspend@1.0-service:打开内核唤醒锁统计信息时出错:wakeup35:权限被拒绝

BitmapDrawable bitmapDrawable = (BitmapDrawable) memeImageView.getDrawable();

Here you are casting GifDrawable to BitmapDrawable which is leading to crash.在这里,您将 GifDrawable 转换为 BitmapDrawable,这会导致崩溃。 For getting Image (as Bitmap Object) this works, but you have to handle GIF separately.为了获取图像(作为位图对象),这是有效的,但您必须单独处理 GIF。 possible check what is loaded in ImageView and share content accordingly.可能检查 ImageView 中加载的内容并相应地共享内容。

For sharing GIF, save GIF on Internal/External storage and share it's URI with:要共享 GIF,请将 GIF 保存在内部/外部存储中并与以下人员共享其 URI:

"image/gif"

Like this:像这样:

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"));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM