如何在安卓系统中直接拨打电话

4

我知道这很简单,但我遇到了一个非常奇怪的问题。我需要通过点击一个按钮来在危险情况下呼叫警察。因此,我使用了以下代码进行呼叫。

Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:100"));
            callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            ctx.startActivity(callIntent);

AndroidManifest.xml中添加了CALL_PHONE权限。问题是它会在拨号盘上打开100,但不会直接拨出电话。我希望用户点击按钮后立即发生拨打电话的动作。

当我尝试在100前加上+91时,它会自动拨打该号码,但为什么需要加上加号呢?所以请有经验的人帮助我解决这个问题。


我怀疑这可能与“100”不是美国电话系统上的有效电话号码有关。(这很可能是一个错误) - Wooble
你好,你找到解决方法了吗?还是一直出现这个问题。 - MSD
6个回答

4

根据 ACTION_CALL 的文档:

注意:有限制条件适用于可以启动通话的应用程序;大多数应用程序应使用 ACTION_DIAL

注意:此意图无法用于呼叫紧急号码。应用程序可以使用 ACTION_DIAL 拨打紧急号码。

因此,这种行为是故意的。


1
具体来说,您需要CALL_PRIVILEGED权限,这是普通SDK应用程序无法获得的。 - CommonsWare

1

调用/开始通话有两种意图:ACTION_CALL和ACTION_DIAL。 ACTION_DIAL仅会打开拨号器并填入号码,但允许用户实际呼叫或拒绝呼叫。ACTION_CALL将立即呼叫该号码,并需要额外的权限。 因此,请确保您拥有所需的权限。


你收到我的问题了吗,@user69226?我知道ACTION_CALL会直接拨打手机号码,但这不会拨打像100等紧急号码。 - TNR

0
很长一段时间过去了。但可能会帮助其他人。 如果您想直接调用,应该使用requestPermissions方法。 1. 将此行添加到您的清单文件中:
<uses-permission android:name="android.permission.CALL_PHONE" />

2. 在活动类中定义一个类变量:

private static Intent phoneCallIntent; //If use don't need a member variable is good to use a static variable for memory performance.

3. 将这些行添加到活动的onCreate方法中:

final String permissionToCall = Manifest.permission.CALL_PHONE;
//Assume that you have a phone icon.
(findViewById(R.id.menuBarPhone)).setOnClickListener(new OnClickListener(){
    public void onClick(View view) {
        phoneCallIntent = new Intent(Intent.ACTION_CALL);
        phoneCallIntent.setData(Uri.parse(getString(R.string.callNumber))); //Uri.parse("tel:your number")
        if (ActivityCompat.checkSelfPermission(MainFrame.this, permissionToCall) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainFrame.this, new String[]{permissionToCall}, 1);
            return;
        }
        startActivity(phoneCallIntent);
    }
});

4. 如果想在点击允许按钮后立即进行调用,则需要重写onRequestPermissionsResult方法:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == 1){
        final int permissionsLength = permissions.length;
        for (int i = 0; i < permissionsLength; i++) {
            if(grantResults[i] == PackageManager.PERMISSION_GRANTED){
                startActivity(phoneCallIntent);
            }
        }
    }

当用户授权后,下一次将不会出现对话框,直接进行呼叫。

0

可能会出现这样的问题,即安卓系统无法将100识别为有效的电话号码,而如果您在其前面加上国家代码,则可以正常工作。要解决此类问题,请查看此库libnhonenumber。您可以像这样使用它

public static ArrayList<String> extractPhoneNumber(String content) {

    ArrayList<String> numbers = new ArrayList<String>(0);

    PhoneNumberUtil instance = PhoneNumberUtil.getInstance();

    //Change IT with your contry code
    Iterable<PhoneNumberMatch> matches = instance.findNumbers(content, "IT");

    Iterator<PhoneNumberMatch> iterator = matches.iterator();

    while (iterator.hasNext()) {
        numbers.add(instance.format(iterator.next().number(), PhoneNumberFormat.INTERNATIONAL));
    }

    return numbers;
}

0
private void phoneCall()
{
 String phoneCallUri = "tel:91";
 Intent phoneCallIntent = new Intent(Intent.ACTION_CALL);
 phoneCallIntent.setData(Uri.parse(phoneCallUri));
 startActivity(phoneCallIntent);
}

0

在没有用户干预的情况下直接调用的最佳方法。

String uri = "tel:" + num.trim();
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse(uri));
startActivity(intent);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接