问题
我们常常在写apk的时候申请一些相关权限。想知道每个权限的作用,可以查询权限声明的地方。
1、三方页面:
https://manifestdestiny.reveb.la/
2、源码注释
/frameworks/base/core/res/AndroidManifest.xml
<!-- @SystemApi @TestApi Allows an application to write to internal media storage
@deprecated This permission is no longer honored in the system and no longer adds
the media_rw gid as a supplementary gid to the holder. Use the
android.permission.MANAGE_EXTERNAL_STORAGE instead.
@hide -->
<permission android:name="android.permission.WRITE_MEDIA_STORAGE"
android:protectionLevel="signature|privileged" />
3、自定义权限
某些应用会自定义权限,定义权限时可以添加说明。
比如launcher中自定义的权限。
<permission
android:name="${packageName}.permission.READ_SETTINGS"
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="signatureOrSystem"
android:label="@string/permlab_read_settings"
android:description="@string/permdesc_read_settings"/>
如果权限没有description也没有注释,那就比较坑了。只能祈祷权限名字可以看出来大概是什么东西。
所幸,源码中权限的声明、注释还是比较全的。
4、自定义权限、权限的使用
源码中的权限声明在这里/frameworks/base/core/res/AndroidManifest.xml
使用在所有源码应用中。有一套完整的权限检测。
apk也可以自己声明权限,对访问自己的外部请求做一些限制。
5、demo
appA
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="android.permission.INTERNET"/>
//声明权限
//等级标记为危险权限,需要动态申请
<permission android:name="com.example.myapplication.MainActivity"
android:icon="@drawable/ic_icon_mouse_37"
android:label="@string/my_permission"
android:description="@string/my_permission_description"
android:protectionLevel="dangerous"
/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:requiredForAllUsers="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:excludeFromRecents="true"
android:permission="com.example.myapplication.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
appB
//注册权限
<uses-permission android:name="com.example.myapplication.MainActivity"/>
//button单击事件
button.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View view) {
//判断权限,有权限的话直接打开appA
//没有权限则动态申请权限
if (checkCallingOrSelfPermission("com.example.myapplication.MainActivity") == PackageManager.PERMISSION_GRANTED){
Intent intent = new Intent();
intent.setClassName("com.example.myapplication","com.example.myapplication.MainActivity");
startActivity(intent);
}else{
requestPermissions(new String[]{"com.example.myapplication.MainActivity"},1001);
}
}
});
//权限同意和拒绝弹提示框
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1001 && "com.example.myapplication.MainActivity".equals(permissions[0])){
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"权限申请成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"权限申请失败",Toast.LENGTH_SHORT).show();
}
}
}