以下内容纯粹为本人学习笔记【记录】之用,所听课程(Q群群友百度网盘提供)为极客学院一位老师所讲(老师大名我尚未知晓),如有侵权请告知。
1、请求权限实例
让页面加载一个网页
MainActivity
package com.keen.leranwebview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
private WebView wv;//声明一个WebView
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wv = (WebView) findViewById(R.id.wv);//查到wv
wv.loadUrl("http:www.baidu.com");//加载一个网页数据
}
}
avtivity_main
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
这回即可成功访问网页了。
如此设计的意义是什么?方便用户看到程序所需要的权限。在设备的应用信息—-权限(Permission)—-应用在安装时,Android系统自带的安装程序会自动补上该应用所需要的权限,且呈现给用户,以此告诉用户该应用所需要的权限。若用户不想授权这个权限给应用,不让其拥有这个权限,可拒绝应用的安装。这是一种权限机制,防止病毒。
2、为代码添加权限检查
1)新建一个类Hello
package com.keen.checkpermissioncode;
/**
* Created by Administrator on 2017/5/20.
*/
public class Hello {
public static final String PERMISSION_SAY_HELLO = "com.keen.checkpermissioncode.permission.SAY_HELLO";
public static void sayHello() {
}
}
2)AndroidManifest “注册”/声明一个“自定义”的权限
<permission android:name="com.keen.checkpermissioncode.permission.SAY_HELLO" />
3)检查执行该程序的代码是否拥有权限。办法:首先,需要一个Context对象,才能访问到全局的一些属性;其次,声明一个变量checkResult,通过context访问方法checkCallingOrSelfPermission(),把对应的permission传给它;最后,判断是否拥有某权限
public class Hello {
public static final String PERMISSION_SAY_HELLO = "com.keen.checkpermissioncode.permission.SAY_HELLO";
public static void sayHello(Context context) {
int checkResult = context.checkCallingOrSelfPermission(PERMISSION_SAY_HELLO);
if (checkResult != PackageManager.PERMISSION_GRANTED) {//若检查结果未授权
throw new SecurityException("执行sayHello方法须权限com.keen.checkpermissioncode.permission.SAY_HELLO");//抛出安全异常
}
Log.d("Permission", "我有sayHello权限哦!");//有权限的话则打印
}
}
在MainActivity添加代码并执行
Hello.sayHello(this);
报错:
原因是没有给它添加(use)权限
<uses-permission android:name="com.keen.checkpermissioncode.permission.SAY_HELLO"/>
成功运行
3、为基本组件添加权限检查
Android四大组件都可以使用同样的方式配置权限,下面以Activity为例。
1)新建一个Activity
2)AndroidManifest声明权限,命名规则为:包名.permission.权限名字
<permission
android:name="com.keen.componentpermission.permission.MyAty" />
3)指定的Activity上添加该权限
<activity android:name=".MyAty"
android:permission="com.keen.componentpermission.permission.MyAty"></activity>
4)MainActiviy和activity_main添加相关操作和监听事件、按钮,以便观察在添加权限的情况。
在同一个程序内的Activity,无须声明权限,都能启动另外一个Activity。
但不同程序间如何启动另外一个程序的Activity?办法如下:
例:(不同程序)AnohterApp如何启动App下的MyAty?需要在MyAty所在的AndroidManifest的MyAty添加如下代码:
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="com.keen.componentpermission.intent.action.MyAty"/>
</intent-filter>
在AnohterApp/MainActivity.java的intent直接添加MyAty的action即可
findViewById(R.id.btnStartMyAty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent("com.keen.componentpermission.intent.action.MyAty"));
}
});
5)分别安装上两个程序后,AnotherApp—启动MyAty,会运行异常
com.keen.anotherapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.keen.anotherapp, PID: 29593
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.keen.componentpermission.intent.action.MyAty }
即找不到MyAty,因为没有访问权限。解决办法:
AnotherApp/AndroidManifest.xml添加访问MyAty的权限
<uses-permission android:name="com.keen.componentpermission.permission.MyAty"/>
为组件添加权限检查的实例全部代码:
ComponentPermission部分
MainActivity
package com.keen.componentpermission;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btnStartMyAty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this, MyAty.class));
}
});
}
}
activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.keen.componentpermission.MainActivity">
<Button
android:id="@+id/btnStartMyAty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动MyAty" />
</LinearLayout>
MyAty默认即可,同时它对应的xml也默认即可
AnotherApp部分
MainActivity
package com.keen.anotherapp;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btnStartMyAty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent("com.keen.componentpermission.intent.action.MyAty"));
}
});
}
}
对应的activity_main.xml添加按钮即可,用于启动MyAty
<Button
android:id="@+id/btnStartMyAty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动MyAty" />
其他都默认即可。