[学习笔记]Android权限系统

以下内容纯粹为本人学习笔记【记录】之用,所听课程(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" />

其他都默认即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值