安卓手机无法打电话

4
我想从我的应用程序中进行电话呼叫。我已经尝试了其他所有方法。我尝试了互联网上的所有解决方案,包括mkyong、tutorialspoint等许多网站。
phoneCalls.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View arg0) {
                            Intent callIntent = new Intent(Intent.ACTION_CALL);
                            callIntent.setData(Uri.parse("tel:0377778888"));

                            if (ActivityCompat.checkSelfPermission(getActivity(),
                                    Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                                return;
                            }
                            startActivity(callIntent);
                        }
                    });

在我的清单文件中,我请求以下权限:

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

上面的代码没有显示任何错误。我再试了一下。
button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Intent callIntent = new Intent(Intent.ACTION_CALL);
                callIntent.setData(Uri.parse("tel:0377778888"));
                startActivity(callIntent);

            }

        });

    }

尝试运行此代码时,Logcat 显示以下错误:
java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:xxxxxxxxxx cmp=com.android.server.telecom/.components.UserCallActivity } from ProcessRecord{80f03c 26994:com.example.user.home/u0a73} (pid=26994, uid=10073) with revoked permission android.permission.CALL_PHONE
                                                                           at android.os.Parcel.readException(Parcel.java:1620)
                                                                           at android.os.Parcel.readException(Parcel.java:1573)
                                                                           at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2680)
                                                                           at android.app.Instrumentation.execStartActivity(Instrumentation.java:1509)
                                                                           at android.app.Activity.startActivityForResult(Activity.java:3930)
                                                                           at android.app.Activity.startActivityForResult(Activity.java:3890)
                                                                           at android.app.Activity.startActivity(Activity.java:4213)
                                                                           at android.app.Activity.startActivity(Activity.java:4181)
                                                                           at com.example.user.home.Main3Activity$1.onClick(Main3Activity.java:30)
                                                                           at android.view.View.performClick(View.java:5204)
                                                                           at android.view.View$PerformClick.run(View.java:21158)
                                                                           at android.os.Handler.handleCallback(Handler.java:739)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:148)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5461)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

希望在这里留下这个问题,希望有人能够帮助解答。


你在尝试哪个操作系统? - Nas
API 23 Android Marshmallow - user6148863
你是否已经实现了用户的运行时权限请求? - Nas
你的应用程序没有权限启动电话呼叫。这就是问题所在。在你的代码中,你试图启动一个电话呼叫,而没有检查你的应用程序是否有权限。在代码的另一部分,你只是检查它是否有权限,如果应用程序没有权限,你不会执行请求。 - Luca Nicoletti
1个回答

5

由于您正在尝试在Marshmallow 6.0上运行它,并且您没有为Marshmallow或更高版本的Android设置运行时权限。

您的代码将在6.0以下版本中运行,但不会在6.0或更高版本中运行。

请使用此代码替换您的代码。

button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0)
        {
            callPhoneNumber();
        }
    });
}

创建带权限检查的调用方法
public void callPhoneNumber()
{
    try
    {
        if(Build.VERSION.SDK_INT > 22)
        {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling

                ActivityCompat.requestPermissions(TestActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 101);

                return;
            }

            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:" + "0377778888"));
            startActivity(callIntent);

        }
        else {
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:" + "0377778888"));
            startActivity(callIntent);
        }
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
}

当用户授予权限时,控制权落在这里

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                          int[] grantResults)
{
    if(requestCode == 101)
    {
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED)
        {
            callPhoneNumber();
        }
        else
        {
            Log.e(TAG, "Permission not Granted");
        }
    }
}

1
非常感谢。这是绝对和全面的解决方案。 - user6148863
非常荣幸 :) - Vishal Chhodwani

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