如何通过编程实现打电话功能?

137

我通过bundle将要呼叫的号码传递给一个Activity

在该Activity中,我有一个按钮来拨打那个号码,这是代码:

callButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(bundle.getString("mobilePhone")));
            }
        }); 

当我按下按钮时,什么也没发生,这里肯定有问题......

我做错了什么?

附注:我正在使用兼容Android 1.5的项目......也许电话呼叫在1.5版本中是不兼容的?


请粘贴logcat输出或详细说明您的错误细节。 - chikka.anddev
在所选答案中,没有检查棉花糖权限。它将无法直接在棉花糖6.0或以上设备上工作。我知道我太晚了,但这个问题有很高的投票率,所以我认为它将有助于未来的其他人。 在棉花糖设备中,我们需要获取运行时权限才能进行呼叫...以下是在棉花糖或更高版本中进行呼叫的示例。如何在Android Marshmallow 6.0或更高版本中进行呼叫 - Vishal Chhodwani
10个回答

272

你忘记调用startActivity了。 应该像这样:

Intent intent = new Intent(Intent.ACTION_CALL);

intent.setData(Uri.parse("tel:" + bundle.getString("mobilePhone")));
context.startActivity(intent);

Intent本身只是描述某事物的对象,它本身并不执行任何操作。

别忘了在你的清单文件中添加相关权限:

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

1
嗨@Lior,如果设备有双卡,我该怎么办?是否可以通过特定的SIM卡打电话? - Dinash
3
@Dinash:请查看已经回答的这个问题:https://dev59.com/V2Ys5IYBdhLWcg3wAfAi - Lior
我已经使用了同样的代码,但在Galaxy S7 edge上无法运行。 这是我的代码 Intent intentCall = new Intent(Intent.ACTION_CALL); String uri = "tel:" + number.trim(); intentCall.setData(Uri.parse(uri)); if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { startActivity(intentCall); } - AngelJanniee
这个模拟器能否在没有物理设备的情况下进行通话? - user3754136
使用此意图需要设置FLAG_ACTIVITY_NEW_TASK标志,因为它在应用程序之外。 - donmj

25

我在手机上尝试了这个方法,它完美地运作了。

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:900..." ));
startActivity(intent);

在清单文件中添加此权限。

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

1
数字是像1689,3,2,1,1。我遇到了一个问题,它只能是1689。如果您有任何解决方案,请帮助我。 - Teraiya Mayur
@TeraiyaMayur 你可以先删除任何非数字字符。所以如果你有一个电话号码,例如 String number = "1689,,3,2,1,1,那么你可以执行 nubmer = "tel:" + number.replaceAll("[^0-9]", ""); - Walk
@Walk,一个问题是我们想要使用特殊符号如,*进行调用。它们必须在数字之间。在模拟器上它可以正常工作,但在设备上会丢失额外的符号和数字。 - CoolMind

13
 Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+198+","+1+","+1)); 
             startActivity(callIntent);

针对多次有序呼叫

此用途为DTMF呼叫系统。如果通话中断,您应该在数字之间添加更多的“ , ”。


Dwivedi先生:数字是像1689、3、2、1、1这样的。我遇到了问题,它只会显示1689。如果您有任何解决方案,请帮助我。 - Teraiya Mayur
@TeraiyaMayur,这取决于IVRS呼叫系统。它对我有用,因为我的呼叫扩展支持提前响应。 - Ashish Dwivedi
是的,你说得对,我也获得了正确有效的IVR号码,并且它可以正常工作。谢谢。 - Teraiya Mayur

3

3

它运行得非常好。这样,您就不需要从用户那里获得许可。您可以直接打开电话呼叫部分。

技巧点,使用ACTION_DIAL而不是ACTION_CALL。

private void callPhoneNumber() {
    String phone = "***********";
    Intent callIntent = new Intent(Intent.ACTION_DIAL);
    callIntent.setData(Uri.parse("tel:" + phone));
    startActivity(callIntent);
}

3
这不需要权限。
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:+123456"))
startActivity(intent)

或者

val intent = Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", "+123456", null))
startActivity(intent)

但它会显示一个额外的对话框(询问您是否只想打一次电话或始终打电话)。因此最好使用ACTION_CALL与权限(请参见已撤销的权限 android.permission.CALL_PHONE)。


2

在这里,我将向您展示如何从您的应用程序中拨打电话。要进行通话,您必须在应用程序中输入以下代码。

try {
    Intent my_callIntent = new Intent(Intent.ACTION_CALL);
    my_callIntent.setData(Uri.parse("tel:"+phn_no));
    //here the word 'tel' is important for making a call...
    startActivity(my_callIntent);
} catch (ActivityNotFoundException e) {
    Toast.makeText(getApplicationContext(), "Error in your phone call"+e.getMessage(), Toast.LENGTH_LONG).show();
}

1
@Astor,我已经非常清楚地定义了它,并且已经通过这个获得了一些积分,这意味着我的答案对某些人来说比其他答案要好一些。 - Pir Fahim Shah

1

如果有人在寻找Kotlin相关的内容

    val  uri = "tel:+800******"
    val call_customer_service = Intent(Intent.ACTION_CALL)
    call_customer_service.setData(Uri.parse(uri))
    startActivity(call_customer_service)

和其他一些解决方案一样,它需要android.permission.CALL_PHONE权限。


0
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
   final Button button = (Button) findViewById(R.id.btn_call);
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            String mobileNo = "123456789";
            String uri = "tel:" + mobileNo.trim();
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse(uri));
            startActivity(intent);
        }
    });*
 }

0
如果您遇到了SecurityException(并且调用不起作用),则应考虑请求用户权限以进行呼叫,因为这被视为危险权限。
ActivityCompat.requestPermissions(
    activity,
    new String[] {Manifest.permission.CALL_PHONE},
    1
);

请注意,这与清单权限无关(您也必须拥有该权限)。

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