请求权限,如访问网页的权限
在安装新App或者使用现有App的时候,大家都有碰到过应用获取权限的问题,比如是否允许使用摄像头,是否允许获取通讯录等等,这些权限一般都是在AndroidManifest.xml里添加。以访问网页权限为例。
创建一个新应用,在布局里添加一个WebView的组件,用于展示网页的内容
// content_main.xml
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webView">
</WebView>
在MainActivity里,添加以下内容
// MainActivity onCreate()
webView = (WebView) findViewById(R.id.webView);
webView.loadUrl("http://www.baidu.com");
最后,为了让webView有访问网页的权限,需要在AndroidManifest里添加以下内容
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
代码权限检查
代码权限检查的使用场景还不熟悉,以后碰到相关问题会进行补充,但这个实现起来也很简单。新建一个类Hello,并给这个类添加一个sayHello的函数,并且对这个函数进行权限检查,满足的时候输出一句话,不满足则输出另外一个信息
public class Hello {
// 自定义的权限名称
public static final String PERMISSION_SAY_HELLO = "com.cyfloel.learnpermission.permission.SAYHELLO";
public static void sayHello(Context context){
// 检查是否有权限运行
int checkResult = context.checkCallingOrSelfPermission(PERMISSION_SAY_HELLO);
if (checkResult != PackageManager.PERMISSION_GRANTED){
// 没有权限,则抛出安全错误
throw new SecurityException("没有权限say hello");
}
// 有权限,则输出一个log信息
Log.i("HELLO","有权限Say Hello!");
}
}
在MainActivity的onCreate函数中,调用sayHello
// 将MainActivity做为context对象
Hello.sayHello(this)
如果没有在AndroidManifest里添加使用权限的声明,则会抛出安全错误,如果添加就会输出log信息
// AndroidManifest
// 声明自定义的权限
<permission android:name="com.cyfloel.learnpermission.permission.SAYHELLO"></permission>
// 添加使用权限
<uses-permission android:name="com.cyfloel.learnpermission.permission.SAYHELLO"></uses-permission>
添加组件权限
为Activity添加权限要求,当其他App启动这个Activity时,需要满足权限才能启动
// APP AndroidManifest
<permission android:name="com.cyfloel.myactivitypermission.permission.ANOTHERACTIVITY"></permission>
//App AndroidManifest application中的内容
<activity
android:name=".AnotherActivity"
android:label="@string/title_activity_another"
android:permission="com.cyfloel.myactivitypermission.permission.ANOTHERACTIVITY"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"></category>
<action android:name="com.cyfloel.myactivitypermission.intent.action.ANOTHERACTIVITY"></action>
</intent-filter>
</activity>
// App MainActivity
findViewById(R.id.btnStartAnotherActivity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//AnotherActivity.ACTION=
//"com.cyfloel.myactivitypermission.intent.action.ANOTHERACTIVITY";
//一个常量,定义与AnotherActivity, 对应AndroidManifest中的action
startActivity(new Intent(AnotherActivity.ACTION));
}
});
// AnotherApp MainActivity
findViewById(R.id.btnStartAnotherActivity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String intentAction = "com.cyfloel.myactivitypermission.intent.action.ANOTHERACTIVITY"
Intent intent = new Intent(intentAction)
startActivity(intent);
}
});
// AnotherApp AndroidManifest
<uses-permission android:name="com.cyfloel.myactivitypermission.permission.ANOTHERACTIVITY"></uses-permission>