【问题标题】:Calling number from dialpad returns warning: "Call requires permission which may be rejected by user"从拨号盘呼叫号码返回警告:“呼叫需要权限,可能被用户拒绝”
【发布时间】:2016-01-20 06:55:02
【问题描述】:

当用户单击具有数字的 TextView 时,我基本上是在尝试拨打一个号码:

number_title.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent callIntent = new Intent(Intent.ACTION_CALL);
                        callIntent.setData(Uri.parse("tel:+"+user.getTelephone()));
                        activity.startActivity(callIntent);
                        //the above line returns the warning given below
                    }
});

我收到的警告:

调用需要权限,可能会被用户拒绝。代码到 明确检查权限是否可用

我了解如果之前未授予权限,该应用需要请求权限。我的问题是,如何在拨打电话之前明确请求许可?

【问题讨论】:

  • 这是关于运行时权限的问题,不是吗?

标签: java android android-intent android-permissions


【解决方案1】:

嗯,这是关于运行时权限的,所以只在清单中声明它们是行不通的。相反,您必须在开始通话之前检查权限。

这样的事情应该可以工作 - 如果用户之前没有授予权限(或者如果他撤销了),只会要求用户提供权限:

private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1234;

public void yourfunction() {
    number_title.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (ContextCompat.checkSelfPermission(thisActivity,
                                                Manifest.permission.CALL_PHONE)
                                != PackageManager.PERMISSION_GRANTED) {

                        ActivityCompat.requestPermissions(activity,
                            new String[]{Manifest.permission.CALL_PHONE},
                            MY_PERMISSIONS_REQUEST_CALL_PHONE);
                    } else {
                        executeCall();
                    }
                }
    });
}

private void executeCall() {
    // start your call here
    activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:+"+user.getTelephone()));
            activity.startActivity(callIntent);         
        }
    });
}


@Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_CALL_PHONE: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay!
                executeCall();


            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }
    }
}

我主要从google取了上面的代码: http://developer.android.com/training/permissions/requesting.html 如果您想了解更多信息,请访问该链接。

编辑: onRequestPermissionsResult 将是您活动中的回调函数。您可能需要在那里处理电话。

【讨论】:

    【解决方案2】:

    这只是一个用于检查权限的参考调用示例:

    if(!checkSelfPermission(Manifest.permission. CALL_PHONE)==PackageManager.PERMISSION_GRANTED){
    
        requestPermissions(this,new String {}(Manifest.permission. CALL_PHONE),INT_TO_CHECK RESULT);
    
    }
    

    让我知道这是否有效。

    已编辑:对代码进行了更改以进行解释。

    【讨论】:

    • 你能在示例代码中展示一下吗?有点困惑用什么代替你显示的变量
    • 还要检查添加运行时权限的链接。 inthecheesefactory.com/blog/…
    • 什么是 checkSelfPermission?什么是 requestPermissions?我得到了那些错误
    • @Earthling:您需要为此阅读开发人员指南。谷歌已经很好地解释了它。供您参考,我还为您提供了一个链接,该链接很好地解释了上述两个功能。 inthecheesefactory.com/blog/… 阅读它们,如果你仍然无法弄清楚。我会帮你的。
    • 谢谢!我会通过他们。感谢您抽出宝贵时间
    【解决方案3】:

    使用这个可能会起作用:

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

    【讨论】:

    • 这无济于事。问题是关于运行时权限。
    • 我认为您是在使用任何第三方应用程序或任何防病毒应用程序来阻止权限。
    • 我想在运行时请求 Call_phone 的权限。我已经将这些添加到清单中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多