You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Wear中通过Intent拨打电话:如何跳过手动选择直接拨号?

嘿,我来帮你捋清楚Android Wear上用Intent拨打电话的这个问题~

你遇到的那个选择弹窗其实是Wear系统的默认安全机制——毕竟大部分智能手表都得靠配对的手机完成通话,系统得确认你是想用手表(如果支持独立通话的话)还是手机发起呼叫,避免误操作扣话费或者打扰别人。不过我们可以试试这些方法优化流程,或者在特定场景下减少弹窗步骤:

首先,先把权限配好

第一步得确保你的应用拿到了必要的通话权限,在AndroidManifest.xml里加上:

<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- 部分设备可能需要这个系统级权限,但普通应用大概率拿不到,先加上试试 -->
<uses-permission android:name="android.permission.CALL_PRIVILEGED" />

注意哦,CALL_PRIVILEGED是系统权限,只有系统应用或者厂商签名的应用才能用,普通APP不用抱太大期望,主要还是靠CALL_PHONE

如果你的手表支持独立通话(比如带eSIM的款)

要是你目标用户用的是像Pixel Watch这种自带eSIM能独立打电话的设备,可以试试用ACTION_CALL代替ACTION_DIAL,前提是已经动态申请了CALL_PHONE权限:

// 先检查权限有没有拿到
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
    Intent callIntent = new Intent(Intent.ACTION_CALL);
    callIntent.setData(Uri.parse("tel:0987654321"));
    callIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(callIntent);
} else {
    // 没权限的话就弹权限申请框
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1001);
}

不过就算这么做,有些设备的系统还是会弹确认窗口——毕竟通话涉及隐私和费用,系统得让用户明确点头才行,这个是系统层面的限制,普通APP绕不开。

依赖手机的情况:优化选择器体验(没法完全关掉,但能简化)

如果你的手表必须靠手机打电话,那选择器肯定躲不掉,但我们可以让它只显示系统默认的电话应用,减少用户的选择步骤:

Intent dialIntent = new Intent(Intent.ACTION_DIAL);
dialIntent.setData(Uri.parse("tel:0987654321"));

PackageManager pm = getPackageManager();
List<ResolveInfo> availableApps = pm.queryIntentActivities(dialIntent, 0);

if (!availableApps.isEmpty()) {
    Intent chooser = Intent.createChooser(dialIntent, "选择通话方式");
    ComponentName defaultDialer = null;
    // 找系统默认的拨号应用
    for (ResolveInfo info : availableApps) {
        if (info.activityInfo.packageName.contains("dialer") || info.activityInfo.packageName.equals("com.google.android.dialer")) {
            defaultDialer = new ComponentName(info.activityInfo.packageName, info.activityInfo.name);
            break;
        }
    }
    if (defaultDialer != null) {
        chooser.putExtra(Intent.EXTRA_DEFAULT, defaultDialer);
        // 排除其他乱七八糟的应用,只留默认拨号
        chooser.putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, new ComponentName[]{});
    }
    startActivity(chooser);
}

这样用户打开选择器的时候,默认就选中系统拨号应用了,点一下确认就行,不用再选来选去。

最后说句实在话

普通应用真的没法完全绕过系统的选择确认窗口,这是Wear OS的安全设计,防止恶意APP偷偷打电话。只有系统自带的电话应用或者拿到厂商特殊权限的APP才能直接拨号不弹窗,咱们普通开发者就别想这个啦。

总得来说,支持独立通话的手表可以试试用ACTION_CALL减少弹窗;依赖手机的就优化选择器体验,尽量让用户操作更简单~

内容的提问来源于stack exchange,提问作者Dmitry

火山引擎 最新活动