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

最近在进行android开发一些小的项目,中间的权限问题在很多项目中都存在,所以就在这里简单的整理一下,分享给大家权限问题从android6开始,为了安全性考虑,权限开始进行双重安全,在我们做好一个项目时,这里以一个打电话的项目为例,权限主要分为两种动态就是在我们安装软件的同时,它会弹出询问你是否开启某一个权限(这里我们是打电话的权限).静态就是我们安装软件过程中不会弹出任何提示,需要我们自己到移...

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

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

权限问题

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

  • 动态
    就是在我们安装软件的同时,它会弹出询问你是否开启某一个权限(这里我们是打电话的权限).
  • 静态
    就是我们安装软件过程中不会弹出任何提示,需要我们自己到移动端的设置中进行开启。不开启不可以实现功能(这里是打电话的功能)
    【第一种方法:代码设置动态权限】
    界面布局
    界面布局
    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(){@Overridepublic 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() { //给按钮设置监听(点击事件)//按钮点击时回调@Overridepublic 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组件  } }}

第二种方法和第一种相比,只是少了其中有关申请权限的代码。其他的没有变化
接下来是最重要的,如果不设置就会程序不可以运行
在这里插入图片描述
在清单文件中,添加权限静态

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

清单文件中设置了静态权限后,我们的程序就可以安装了
.在这里插入图片描述
不管是在模拟器还是手机中,一定要开启打电话的权限设置,不然不可以打电话
【评论需要解决的问题或者文章中的不恰当的地方,接受改正】

源文地址:https://www.guoxiongfei.cn/csdn/4638.html