安卓权限请求代码问题

3

如何请求权限?我尝试过查看文档,但是常量int请求代码MY_PERMISSIONS_REQUEST_CALL_PHONE似乎不能正常工作,还有什么需要注意的反向兼容性吗?

ActivityCompat.requestPermissions(getApplicationContext(),
                            new String[]{Manifest.permission.READ_CONTACTS},
                            MY_PERMISSIONS_REQUEST_CALL_PHONE);

如何声明MY_PERMISSIONS_REQUEST_CALL_PHONE常量int?

也许这对你有用 http://stackoverflow.com/a/36787464/3436179 - Alexander
请检查此参考链接:http://www.tutorialspoint.com/android/android_phone_calls.htm。 - Damini Mehra
5个回答

8
public void makeCall(String s)
{
    Intent intent = new Intent(Intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:" + s));
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){

        requestForCallPermission();

    } else {
        startActivity(intent);

    }
}
public void requestForCallPermission()
{

    if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CALL_PHONE))
    {
    }
    else {

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

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
{
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                makeCall("100");
            }
            break;
    }
}

//现在调用方法makeCall("你想要拨打的电话号码"); makeCall("100"); 更多详情请查看链接


4

对于较低版本,您只需要在清单中声明权限, 但对于Marshmallow,您需要在要执行代码的位置中给出权限。

在此处,您想发起通话。因此,请将下面提供的代码插入/包含在编写呼叫的代码块中。

   public void makeCall(){
       Intent intent = new Intent(Intent.ACTION_CALL);
       intent.setData(Uri.parse("tel:" + "123456"));
       int result = ContextCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE);
       if (result == PackageManager.PERMISSION_GRANTED){
           startActivity(intent);
       } else {
           requestForCallPermission(); 
       }
  }

  private void requestPermission(){
    if(ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.CALL_PHONE)){} 
    else {
           ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CALL_PHONE},PERMISSION_REQUEST_CODE);
       }
  }

  @Override
  public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
                makeCall(); 
            } 
            break;
      }
  }

2
是的,我理解了,但是如何声明PERMISSION_REQUEST_CODE? - ueen
2
抱歉,我忘记告诉你了,你需要像下面这样在顶部声明它 private static final int PERMISSION_REQUEST_CODE = 1; - Vickyexpert
同时,在requestPermission()方法的else部分,将权限更改为CALL_PHONE而不是ACCESS_FINE_LOCATION。 - Vickyexpert

0
您还需要在AndroidManifest.xml中指定要使用的权限,例如:

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


0
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:" + "123456"));
            startActivity(intent);

试着这样做。


谢谢,它开始工作了,我猜我把startActivity放在if之前 :) - ueen
是的,那就是唯一的问题。继续学习吧。 :) - Sharad Chauhan

0
尝试下面的代码,希望能帮到您。 首先,它会要求您允许弹出窗口,然后才会拨打号码。
if (ContextCompat.checkSelfPermission(HomePanelActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(HomePanelActivity.this,
                    Manifest.permission.CALL_PHONE)) {
                ActivityCompat.requestPermissions(HomePanelActivity.this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_PERMISSION);
            }
        } else {
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:" + phoneNumber));
            if (ActivityCompat.checkSelfPermission(HomePanelActivity.this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                startActivity(callIntent);
            }
        }

@Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 10:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Intent callIntent = new Intent(Intent.ACTION_CALL);
                    callIntent.setData(Uri.parse("tel:" + phoneNumberToCall));
                    if (ActivityCompat.checkSelfPermission(HomePanelActivity.this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                        startActivity(callIntent);
                    }
                } else {
                    Snackbar.make(drawerLayout, "You Deny permission", Snackbar.LENGTH_SHORT).show();
                return;
            }
        }
    };

我需要在启动时获取权限,并在按钮点击时进行调用。 而且我需要这个权限,因此拒绝是不可选的... - ueen
这需要API23,我的应用的最低SDK版本是15。 - ueen
是的,您需要编译SDK版本到23。最低15也可以工作。 - Drup Desai

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