【问题标题】:Viber share button throws exception in AndroidViber 分享按钮在 Android 中引发异常
【发布时间】:2016-09-07 09:38:16
【问题描述】:

我正在开发 Android 应用程序。在我的应用程序中,我添加了 Viber 共享功能。所以我在网上搜索了“如何在android中与viber共享内容”。然后我找到了 Viber 做生意。所以对于分享按钮,我点击了这个链接,https://www.viber.com/en/viber-share-button。如您所见,它是如此简单。它只是要求使用 url 重定向到浏览器。所以我打开一个带有 url 的浏览器在 viber 上分享如下。

   private void shareOnViberClick()
        {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("viber://forward?text=textIWantToShare"));
            startActivity(browserIntent);
        }

但是当我点击分享按钮并调用该方法时,它会抛出以下错误

09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime: FATAL EXCEPTION: main
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=viber://forward?text=မန္ယူအသင္း၏ ပရိတ္သတ္ဟုထုတ္ေဖာ္ေျပာျပခဲ့သည့္ ေဒါ့မြန္လူငယ္ၾကယ္ပြင့္ }
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1632)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1424)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.app.Activity.startActivityForResult(Activity.java:3390)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.app.Activity.startActivityForResult(Activity.java:3351)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:842)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.app.Activity.startActivity(Activity.java:3587)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.app.Activity.startActivity(Activity.java:3555)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at tonightfootballreport.com.tfr.NewsDetailsActivity.shareOnViberClick(NewsDetailsActivity.java:364)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at tonightfootballreport.com.tfr.NewsDetailsActivity.access$200(NewsDetailsActivity.java:47)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at tonightfootballreport.com.tfr.NewsDetailsActivity$4.onClick(NewsDetailsActivity.java:134)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.view.View.performClick(View.java:4240)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:17721)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:730)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:92)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:137)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5103)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:525)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-07 05:33:02.357 11715-11715/tonightfootballreport.com.tfr E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
09-07 05:33:02.637 11715-11830/tonightfootballreport.com.tfr D/dalvikvm: GC_FOR_ALLOC freed 601K, 8% free 9230K/10032K, paused 56ms, total 60ms
09-07 05:33:05.029 11715-11833/tonightfootballreport.com.tfr D/dalvikvm: GC_FOR_ALLOC freed 258K, 6% free 10866K/11548K, paused 8ms, total 8ms

为什么会抛出这个错误?我关注的 Viber 分享 API 是否正确?

【问题讨论】:

    标签: android android-intent viber


    【解决方案1】:

    无法保证intent-filter 的活动符合您的要求,因此startActivity() 可能会失败,这应该在您的代码中处理。如果发生这种情况,它会抛出 ActivityNotFoundException,所以只需用 try/catch 包裹你的 startActivity()

    【讨论】:

    • 啊。但它总是抛出异常。所以这意味着 Viber Share 根本不起作用?
    • 不,这正是我所说的 - 该设备上没有应用程序具有 intent-filter 来处理您的 viber://forward?text=textIWantToShare 的 Activity。所以要么你需要做一些不同的事情让 Viber 来处理它?您可以使用此工具:play.google.com/store/apps/… 查看其他有效的应用发送方式
    • 哦。谢谢你。是的,我的设备没有安装 Viber。
    • 因此,您唯一的解决方案是添加对话框以让用户知道没有安装 Viber(可能通过按钮直接链接到 Play 商店),或者您可以尝试以较少的应用程序特定方式共享,因此用户将能够选择他/她想要使用的应用程序。如果这回答了您的问题,请accept it
    • 好的。感谢您的支持。
    【解决方案2】:

    If you prepend http:// may be problem solved.

    Uri uri = Uri.parse("http://www.google.com");
    

    Like in your case may be work around with viber url.

    Uri.parse("http://viber:forward?text=textIWantToShare")
    

    编辑 1:

    May be they are using this url scheme only for web we not be able to use it through our app.

    So may be you can do this way.

    boolean found = false;
    Intent share = new Intent(android.content.Intent.ACTION_SEND);
            share.setType("text/plain");
    
            // gets the list of intents that can be loaded.
            List<ResolveInfo> resInfo = context.getPackageManager()
                    .queryIntentActivities(share, 0);
            if (!resInfo.isEmpty()) {
                for (ResolveInfo info : resInfo) {
                    if (info.activityInfo.packageName.toLowerCase(
                            Locale.getDefault()).contains("com.viber.voip")
                            || info.activityInfo.name.toLowerCase(
                                    Locale.getDefault()).contains("com.viber.voip")) {
                        share.putExtra(Intent.EXTRA_TEXT, "Your text to share");
                        share.setPackage(info.activityInfo.packageName);
                        found = true;
                        context.startActivity(Intent.createChooser(share, "Select"));
                        break;
                    }
                }
                if (!found) {
    
                    displayToast(context, "Install viber android application");
                    Uri marketUri = Uri.parse("market://details?id="
                            + "com.viber.voip");
                    Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
                    context.startActivity(marketIntent);
                }
    
            }
    

    And also whatever Marcin sir have suggested in his answer.

    【讨论】:

    • 但是 Viber 应该只使用这个 url 架构 viber://forward?text=。
    • @WaiYanHein 可能他们正在使用这个 url 方案 仅用于网络,我们无法通过我们的应用程序使用它。
    • @WaiYanHein 检查我为不同方法编辑的答案。
    【解决方案3】:

    这意味着设备没有任何意图启动当前指定的意图。所以,请检查条件 (smsIntent.resolveActivity(mPackageManager) != null) 以便我们可以向用户显示任何消息

    尝试使用

    Intent i = new Intent(Intent.ACTION_SEND);
    i.setPackage("com.viber.voip");
    i.setType("text/plain");
    i.putExtra(Intent.EXTRA_TEXT, "Message body");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多