最近在进行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(){
@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组件
}
}
}
第二种方法和第一种相比,只是少了其中有关申请权限的代码。其他的没有变化
接下来是最重要的,如果不设置就会程序不可以运行
在清单文件中,添加权限静态
<uses-permission android:name="android.permission.CALL_PHONE"/>
清单文件中设置了静态权限后,我们的程序就可以安装了
.
不管是在模拟器还是手机中,一定要开启打电话的权限设置,不然不可以打电话
【评论需要解决的问题或者文章中的不恰当的地方,接受改正】