怎样获取android权限(Android请求权限)
安卓系统权限分为两类:正常权限和危险权限。正常权限不会给用户隐私带来风险,只需在 AndroidManifest.xml 清单中列出该权限,系统将自动授予该权限。
而危险权限会授予应用访问用户数据,你首先要在清单中列出,然后再在代码中请求用户允许授予该权限。
1、声明权限
首先必须要在 AndroidManifest.xml 文件中列出所需权限,在该文件里的 manifest 标签中添加如同下面格式的权限声明。(文件位置在:Android > app > manifest > AndroidManifest.xml)
<!-- 权限声明列表 AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET"/><!--网络访问-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/><!--获取手机状态-->
其中的 INTERNET 网络访问权限为正常权限,是不需要额外请求用户授权的,系统将自动允许该权限。而其它危险权限就需要用户明确授予,使用 ActivityCompat.requestPermissions() 方法来请求一个或多个权限。
// 申请单个权限
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.READ_PHONE_STATE
}, 1);
在请求用户授予权限之前使用 ContextCompat.checkSelfPermission() 方法检查某个权限的授予状态,它将返回常量值。你还可以使用 List 接口来整合未授予的权限以便待会集中申请。
// 无权限:PackageManager.PERMISSION_DENIED
// 有权限:PackageManager.PERMISSION_GRANTED
// 检查权限是否已经授予
int PermissionState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
if(PermissionState == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "已授权!", Toast.LENGTH_LONG).show();
}else if(PermissionState == PackageManager.PERMISSION_DENIED){
Toast.makeText(this, "未授权!", Toast.LENGTH_LONG).show();
}
【代码文件】activity_main.xml
<!-- activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@ id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:onClick="requestPermissions"
android:text="请求权限"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
【代码文件】AndroidManifest.xml
<!-- AndroidManifest.xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.myapplication">
<uses-permission android:name="android.permission.INTERNET"/><!--网络访问-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/><!--获取手机状态-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--存储权限-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><!--粗略位置信息-->
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
【代码文件】MainActivity.java
// MainActivity.java
package com.android.myapplication;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
String[] Permissions = new String[]{
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 请求权限
public void requestPermissions(View view){
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setTitle("申请权限")
.setMessage("请选择需要申请的权限个数")
.setNegativeButton("单个", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
RequestPermission_1();
}
})
.setPositiveButton("多个", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
RequestPermission_2();
}
})
.create();
alertDialog.show();
}
// 请求单个权限
public void RequestPermission_1(){
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.READ_PHONE_STATE
}, 1);
}
// 请求多个权限
public void RequestPermission_2(){
List<String> PermissionList = new ArrayList<>(); // 使用 List 来存储需要授权的权限列表
for (String permission : Permissions) {
if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED) {
PermissionList.add(permission);
}
}
if(PermissionList.isEmpty()){
Toast.makeText(MainActivity.this, "所有权限均已授权", Toast.LENGTH_LONG).show();
}else{
String[] permissions = PermissionList.toArray(new String[0]);
ActivityCompat.requestPermissions(this, permissions, 1);
}
}
}
在申请权限时如果用户选择了不再询问或禁止后不再提示选项,那么下一次在应用申请该权限时系统将会自动选择禁止,我将会在下一篇文章中介绍该如何处理它。
如果文章中含有某些错误或其它问题,欢迎在下方评论留言,我会及时修改。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com