android开发中的申请权限问题(android studio)

最近在进行android开发一些小的项目,中间的权限问题在很多项目中都存在,所以就在这里简单的整理一下,分享给大家

权限问题

从android6开始,为了安全性考虑,权限开始进行双重安全,在我们做好一个项目时,这里以一个打电话的项目为例,权限主要分为两种

  • 动态
    就是在我们安装软件的同时,它会弹出询问你是否开启某一个权限(这里我们是打电话的权限).
  • 静态
    就是我们安装软件过程中不会弹出任何提示,需要我们自己到移动端的设置中进行开启。不开启不可以实现功能(这里是打电话的功能)
    第一种方法:代码设置动态权限
    界面布局
    android开发中的申请权限问题(android studio)
    activity.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="cn.experiment.phonecall.MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="20"
        android:textColor="#000000"
        android:id="@+id/et_number"
        android:hint="@string/phonenumber" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/dail"
        android:id="@+id/btn_dial"
        android:layout_below="@+id/et_number"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="20dp" />
</RelativeLayout>

首先讲讲利用代码进行动态申请权限
Mainactivity.java

public class MainActivity extends Activity {
//设置成成员变量,方便后期代码的操作
    private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1;
    private Button btn_dial;
    private EditText et_number;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //首先我们进行初始化操作,找到布局文件中的控件
        findViewById(R.id.et_number); 
        Button btn_dial = (Button) findViewById(R.id.btn_dial);
        
        //给按钮设置监听器
        btn_dial.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
            
               //检查是否获得权限
                if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    //没有获得授权,申请授权
                    if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CALL_PHONE)) {
                        //弹窗解释为何需要该权限,再次请求权限
                        Toast.makeText(MainActivity.this, "请授权!", Toast.LENGTH_LONG).show();
                        //跳转到应用设置界面
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        Uri uri = Uri.fromParts("package", getPackageName(), null);
                        intent.setData(uri);
                        startActivity(intent);
                    } else {
                        //不需要解释为何需要授权直接请求授权
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);
                    }
                } else {
                    //获得授权,拨打电话
                    CallPhone();
                }
            }
        });
    }
    private void CallPhone() {
        EditText et_number = (EditText) findViewById(R.id.et_number);//  获取到文本框中的内容
        String number = et_number.getText().toString(); //得到电话号码
        //设置判断事件,判断空格和回车
        if (TextUtils.isEmpty(number)) {
            Toast.makeText(MainActivity.this, "号码不能为空!", Toast.LENGTH_SHORT).show();
        } else {
            //激活拨号组件/intent表示想干什么事
            Intent intent = new Intent();//意图对象:动作+号码
            intent.setAction(Intent.ACTION_CALL);//执行打电话的动作
            Uri data = Uri.parse("tel:" + number);//打电话的号码
            intent.setData(data);
            //开始一个新的动作
            startActivity(intent); //激活acitivity组件
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_CALL_PHONE: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //授权成功,继续拨打电话
                    CallPhone();
                } else {
                    //授权失败
                    Toast.makeText(this, "授权失败!", Toast.LENGTH_LONG).show();
                }
                break;
            }
        }
    }
}

第二种方法:设置静态权限
布局文件依然不变
Mainactivity.java

public class MainActivity extends Activity {
    private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1;
    private Button btn_dial;
    private EditText et_number;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.et_number); //找到输入框
        Button btn_dial = (Button) findViewById(R.id.btn_dial);//找到按钮
        btn_dial.setOnClickListener(new View.OnClickListener() { //给按钮设置监听(点击事件)
            //按钮点击时回调
            @Override
            public void onClick(View view) {
                    CallPhone();
                }
        });
    }
    private void CallPhone() {
        EditText et_number = (EditText) findViewById(R.id.et_number);//  获取到文本框中的内容
        String number = et_number.getText().toString(); //得到电话号码
        if (TextUtils.isEmpty(number)) {
            Toast.makeText(MainActivity.this, "号码不能为空!", Toast.LENGTH_SHORT).show();
        } else {
            //激活拨号组件/intent表示想干什么事
            Intent intent = new Intent();//意图对象:动作+号码
            intent.setAction(Intent.ACTION_CALL);//执行打电话的动作
            Uri data = Uri.parse("tel:" + number);//打电话的号码
            intent.setData(data);
            //开始一个新的动作
            startActivity(intent); //激活acitivity组件
        }
    }
            }

第二种方法和第一种相比,只是少了其中有关申请权限的代码。其他的没有变化
接下来是最重要的,如果不设置就会程序不可以运行
android开发中的申请权限问题(android studio)
在清单文件中,添加权限静态

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

清单文件中设置了静态权限后,我们的程序就可以安装了
.android开发中的申请权限问题(android studio)
不管是在模拟器还是手机中,一定要开启打电话的权限设置,不然不可以打电话
【评论需要解决的问题或者文章中的不恰当的地方,接收改正】

上一篇:History of Best Paper Awards in AI, NLP, CV, PR, and ML


下一篇:彻底搞懂ET与LT,另外还有TinyWebServer中的一点小问题