【问题标题】:How to start Viber call from an Android app [new version]?如何从 Android 应用程序 [新版本] 启动 Viber 通话?
【发布时间】:2014-01-27 17:19:36
【问题描述】:

不久前我创建了this 帖子,我和我的同事找到了两个不同的答案(两个都有效):

  1. 第一个解决方案是使用

    意图 callIntent = new Intent("android.intent.action.CALL_PRIVILEGED");

    这将打开新窗口,供所有人拨打电话 拨打电话的可能方式 - 在这种特殊情况下,他们是 拨号器、Viber 和 Skype(或以后添加的任何其他方法)。

  2. 第二种解决方案是明确调用 Viber 并放置电话 被呼叫的号码

    意图 viberCallIntent = new Intent("com.viber.voip.action.CALL"); viberCallIntent.setType("vnd.android.cursor.item/vnd.com.viber.voip.call"); viberCallIntent.setData(Uri.parse("tel:" + dialNumber)); viberCallIntent.putExtra("external_call", true); viberCallIntent.putExtra("contact_id", -1L); startActivity(viberCallIntent);

自上次 Viber 更新(我们昨天注意到)以来,这些方法都不起作用。第一个只是使用 Skype 通话,甚至不提供拨号器(!?!),但如果没有安装 Skype,那么它将回退到拨号器并拨打电话。第二个崩溃,声称没有找到处理 Intent 的 Activity?

知道发生了什么,如何解决?

错误日志如下:

01-27 17:35:03.794: E/AndroidRuntime(7738): FATAL EXCEPTION: main
01-27 17:35:03.794: E/AndroidRuntime(7738): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.viber.voip dat=tel:xxxxxxxxx (has extras) }
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1628)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1423)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.app.Activity.startActivityForResult(Activity.java:3388)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.app.Activity.startActivityForResult(Activity.java:3349)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.app.Activity.startActivity(Activity.java:3584)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.app.Activity.startActivity(Activity.java:3552)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at rs.limitline.maxitaxins.MainActivity.callViber(MainActivity.java:96)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at rs.limitline.maxitaxins.MainActivity.onClick(MainActivity.java:186)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.view.View.performClick(View.java:4212)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.view.View$PerformClick.run(View.java:17476)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.os.Handler.handleCallback(Handler.java:800)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.os.Handler.dispatchMessage(Handler.java:100)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.os.Looper.loop(Looper.java:194)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at android.app.ActivityThread.main(ActivityThread.java:5431)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at java.lang.reflect.Method.invokeNative(Native Method)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at java.lang.reflect.Method.invoke(Method.java:525)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
01-27 17:35:03.794: E/AndroidRuntime(7738):     at dalvik.system.NativeStart.main(Native Method)

[更新] 这也显示为错误:

01-27 19:46:56.704: D/Greska(19822): Permission Denial: starting Intent { act=com.viber.voip.action.CALL dat=tel:xxxxxxxxx cmp=com.viber.voip/com.viber.service.OutgoingCallBroadcaster (has extras) } from ProcessRecord{416c41b8 19822:rs.limitline.maxitaxins/u0a10065} (pid=19822, uid=10065) not exported from uid 10147

【问题讨论】:

  • 我也面临同样的问题:(
  • 你有什么办法可以直接打电话吗?正如 dvpublic 提到的。没有两步流程,还有其他解决方案吗?
  • @Tej 当时我们没有解决方案。从那以后,我再也没有重新审视过这个问题。

标签: android viber


【解决方案1】:

根据 Viber 的清单,有一个活动“com.viber.voip.phone.PhoneActivity”负责操作“com.viber.voip.action.CALL”。在新版本的 Viber (4.2.1.1) 中,此活动由 android:exported="false" 标记。因此,无法再从外部应用程序启动此活动...

编辑

此代码打开指定联系人的欢迎屏幕

String sphone = "12345678";
Uri uri = Uri.parse("tel:" + Uri.encode(sphone)); 
Intent intent = new Intent("android.intent.action.VIEW");
intent.setClassName("com.viber.voip", "com.viber.voip.WelcomeActivity");
intent.setData(uri); 
context.startActivity(intent);

但用户应点击“免费通话”按钮开始通话。

【讨论】:

  • 我已经添加了可能的代码示例,但用户应该再单击一次以开始通话..
  • 好的,我稍后再试,会告诉你是否有效。
  • 需要打开两次,有没有办法在后台打开viber,或者一些intent flags。
  • 很棒的搜索!谢谢
  • @dvpublic 是否有任何解决方法可以一步完成。无需额外点击?
【解决方案2】:

可以通过 Viber 直接拨打电话(无需 WelcomeActivity),但用户应该在联系人中有此号码。

public void callToViberContact(String phoneNumber, Context context) {
    Uri uri = getUriFromPhoneNumber(phoneNumber, context);
    if (uri != null) {
        Intent intent = new Intent("android.intent.action.VIEW");
        intent.setClassName("com.viber.voip", "com.viber.voip.SystemDialogActivityPublic");
        intent.setData(uri);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    } else {
        Toast.makeText(context, "Number is not in Viber Contacts List", Toast.LENGTH_LONG).show();
    }
}

private Uri getUriFromPhoneNumber(String phoneNumber, Context context) {
    Uri uri = null;
    String contactId = getContactIdByPhoneNumber(phoneNumber, context);
    if (!TextUtils.isEmpty(contactId)) {
        Cursor cursor = context.getContentResolver().query(
                ContactsContract.Data.CONTENT_URI, new String[]{ContactsContract.Data._ID},
                ContactsContract.Data.DATA2 + "=? AND " + ContactsContract.Data.CONTACT_ID + " = ?",
                new String[]{"Viber", contactId}, null);
        if (cursor != null) {
            while (cursor.moveToNext()){
                String id = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Data._ID));
                if (!TextUtils.isEmpty(id)) {
                    uri = Uri.parse(ContactsContract.Data.CONTENT_URI + "/" + id);
                    break;
                }
            }
            cursor.close();
        }
    }
    return uri;
}

private String getContactIdByPhoneNumber(String phoneNumber, Context context) {
    ContentResolver contentResolver = context.getContentResolver();
    String contactId = null;
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));

    String[] projection = new String[]{ContactsContract.PhoneLookup._ID};

    Cursor cursor =
            contentResolver.query(
                    uri,
                    projection,
                    null,
                    null,
                    null);

    if (cursor != null) {
        while (cursor.moveToNext()) {
            contactId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
        }
        cursor.close();
    }
    return contactId;
}

需要READ_CONTACTS 权限。不要忘记在 Manifest 中添加:

<uses-permission android:name="android.permission.READ_CONTACTS" />

【讨论】:

  • 我收到以下错误:08-20 22:55:06.299: E/AndroidRuntime(32740): FATAL EXCEPTION: main 08-20 22:55:06.299: E/AndroidRuntime(32740): android.content.ActivityNotFoundException:找不到显式活动类 {com.viber.voip/com.viber.voip.SystemDialogActivityPublic};您是否在 AndroidManifest.xml 中声明了此活动?
  • 我也面临@FRR 提到的同样问题。你有什么解决办法吗?
【解决方案3】:
String uriString = "content://com.android.contacts/data/" + _id;

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(uriString));
intent.setPackage(PKG_VIBER);
startActivity(intent);

_id可以从contacts2.db(Column ContactsContract.Data._ID)中查询到

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多