2019-03-08 11:03:38 qinhai1989 阅读数 72
  • Android应用开发进阶与实践

    本课程是Android应用开发的进阶篇,以实践为主,学习本课程要求学习者首先掌握Java基础,Android开发基础,此课程在此基础上进一步探索,此课程不适合没有Java和Android基础的人员。

    7078 人正在学习 去看看 刘安战

运行时权限

Android M即6.0开始,对于某些用户敏感权限,系统不再默认授权,不仅要在AndriodManifest中声明,还要弹出系统权限框,让用户主动授权。
出于此限制,很多应用不得不修改原来的交互,加入运行时权限判断,避免因为无权限导致的功能不可用。

关于应用权限的详细介绍,可以参考官方文档:
应用权限

下面的例子是我平时项目中的一个简单应用。

代码实例

public class MainActivity extends Activity {

    private static final int MY_PERMISSIONS_REQUEST = 8000;
    private List<String> mPermissions = new ArrayList<String>();

    public void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (mPermissions != null) {
                mPermissions.clear();
            }
			// 检查是否已经获得权限
            if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                if (mPermissions != null)
                    mPermissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
            }
            if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                if (mPermissions != null)
                    mPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }
            if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                if (mPermissions != null)
                    mPermissions.add(Manifest.permission.CAMERA);
            }
            if (mPermissions != null && mPermissions.size() > 0) {
                requestPermissions(mPermissions.toArray(new String[]{}), MY_PERMISSIONS_REQUEST);// 批量请求权限
            } else {
                Log.d(TAG, "all permissions are granted");
            }

        }
    }
	
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
		// 权限授权结果回调
        Log.d(TAG, "onRequestPermissionsResult requestCode:" + requestCode);
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST:
                if (grantResults != null && grantResults.length > 0) {
                    for (int i = 0; i < grantResults.length; i++) {
                        if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { // 权限授权的情况可以进行业务处理
                            Log.d(TAG, "onRequestPermissionsResult(), " + permissions[i] + " is granted");
                        } else {
                            Log.d(TAG, "onRequestPermissionsResult(), " + permissions[i] + " is not granted");
                        }
                    }
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                break;
        }

    }
}

参考资料

  1. 在运行时请求权限
2018-07-19 14:42:18 z_x_Qiang 阅读数 6064
  • Android应用开发进阶与实践

    本课程是Android应用开发的进阶篇,以实践为主,学习本课程要求学习者首先掌握Java基础,Android开发基础,此课程在此基础上进一步探索,此课程不适合没有Java和Android基础的人员。

    7078 人正在学习 去看看 刘安战

未知来源应用权限

 

Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限

以前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知来源的应用都可以被安装。

Android8.0的变化是,未知应用安装权限的开关被除掉,取而代之的是未知来源应用的管理列表,需要在里面打开每个应用的未知来源的安装权限。Google这么做是为了防止一开始正经的应用后来开始通过升级来做一些不合法的事情,侵犯用户权益。 
当你的应用直接适配到Android8之后,内部启动应用安装是会被阻塞的,如果不处理好这个未知来源的权限,会导致应用根本无法更新,只能去应用市场重新下载。 

适配android 8.0:

1.需要在manifast.xml中ti添加一个权限:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

2.由于这个quan权限不是运行权限,所以不能通过请求权限获取权限;要通过下面一行代码获取是否有权限,返回一个boolean类型,true有权限,falsewuqu无权限;

getPackageManager().canRequestPackageInstalls();

3.跳到设置页面进行设置,通过startActivityForResult的方法,返回设置结果;

    public void checkPermission(){
        boolean haveInstallPermission;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            haveInstallPermission = getPackageManager().canRequestPackageInstalls();
            if(!haveInstallPermission){
                //没有权限让调到设置页面进行开启权限;
                Uri packageURI = Uri.parse("package:" + getPackageName());
                Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
                startActivityForResult(intent, 10086);
            }else{

                //有权限,执行自己的逻辑;
               
            }
        }else{
            //其他android版本,可以直接执行安装逻辑;
           
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK && requestCode == 10086) {
            //返回权限后,执行自己的逻辑;
            
        }
    }

 

2017-03-12 21:10:42 shizhonghuo19870328 阅读数 992
  • Android应用开发进阶与实践

    本课程是Android应用开发的进阶篇,以实践为主,学习本课程要求学习者首先掌握Java基础,Android开发基础,此课程在此基础上进一步探索,此课程不适合没有Java和Android基础的人员。

    7078 人正在学习 去看看 刘安战

在开发android 应用的时候,经常要给应用添加权限。权限的添加是在AndroidManifest.xml 中。


下面是总结的一些常用的 权限添加。

    <!-- 网络访问权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 获取网络信息状态,如当前的网络连接是否有效 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 读取手机状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 允许程序写入外部存储,如SD卡上写文件 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 获取错略位置 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 获取WiFi状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <!-- 震动权限 -->
    <uses-permission android:name="android.permission.VIBRATE" />

2019-11-15 11:20:09 sinat_35109311 阅读数 54
  • Android应用开发进阶与实践

    本课程是Android应用开发的进阶篇,以实践为主,学习本课程要求学习者首先掌握Java基础,Android开发基础,此课程在此基础上进一步探索,此课程不适合没有Java和Android基础的人员。

    7078 人正在学习 去看看 刘安战

banner
这篇文章为大家系统的梳理一下 Android 权限相关的知识,在日常开发中,我们都用过权限,但是对于权限的一些细节我们可能掌握的还不够全面,这篇文章会全面的为大家介绍权限相关的知识。当然,本篇文章依然是参考了 Google 的官方文档:应用权限

本文目录

目录

一、认识 Android 权限

(一)Android 系统为什么需要权限?

Android 系统设置权限的目的是保护 Android 用户的隐私。对于用户的敏感数据 Android 应用程序必须向用户申请授权后才能访问(如联系人和短信),另外还包括某些系统功能(如摄像头、麦克风)的权限。根据功能的不同,系统可能会自动授予权限或提示用户批准请求。Android 安全架构的一个核心设计要点是,在默认情况下,没有应用程序可以执行任何可能对其他应用程序、操作系统或用户造成不利影响的操作。这包括读取或写入用户的私人数据(如联系人或电子邮件)、读取或写入另一个应用程序的文件、执行网络访问等等。

(二)权限分类

权限分为几个保护级别。保护级别影响是否需要运行时权限请求:

  1. Normal permissions 正常权限
  2. Signature permissions 签名权限
  3. Dangerous permissions 危险权限

需要我们了解的是正常权限和危险权限。

1.正常权限

正常的权限覆盖了应用程序需要访问沙箱之外的数据或资源的区域,但这些区域对用户隐私或其他应用程序的操作几乎没有风险。例如,设置时区的权限是正常的权限。
如果应用程序在它的清单中声明它需要一个正常的权限,系统会在安装时自动授予该权限。系统不提示用户授予正常权限,用户也不能撤销这些权限。

  • ACCESS_LOCATION_EXTRA_COMMANDS
  • ACCESS_NETWORK_STATE
  • ACCESS_NOTIFICATION_POLICY
  • ACCESS_WIFI_STATE
  • BLUETOOTH
  • BLUETOOTH_ADMIN
  • BROADCAST_STICKY
  • CHANGE_NETWORK_STATE
  • CHANGE_WIFI_MULTICAST_STATE
  • CHANGE_WIFI_STATE
  • DISABLE_KEYGUARD
  • EXPAND_STATUS_BAR
  • GET_PACKAGE_SIZE
  • INSTALL_SHORTCUT
  • INTERNET
  • KILL_BACKGROUND_PROCESSES
  • MODIFY_AUDIO_SETTINGS
  • NFC
  • READ_SYNC_SETTINGS
  • READ_SYNC_STATS
  • RECEIVE_BOOT_COMPLETED
  • REORDER_TASKS
  • REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
  • REQUEST_INSTALL_PACKAGES
  • SET_ALARM
  • SET_TIME_ZONE
  • SET_WALLPAPER
  • SET_WALLPAPER_HINTS
  • TRANSMIT_IR
  • UNINSTALL_SHORTCUT
  • USE_FINGERPRINT
  • VIBRATE
  • WAKE_LOCK
  • WRITE_SYNC_SETTINGS

2.危险权限

危险权限包括应用程序需要涉及用户私人信息的数据或资源的区域,也包括可能影响用户存储的数据或其他应用程序的操作的区域。例如,读取用户的联系人是一种危险的权限。如果一个应用程序声明它需要一个危险的权限,用户必须显式地授予该应用程序权限。在用户批准该权限之前,应用程序不能提供依赖于该权限的功能。
要使用危险的权限,应用程序必须在运行时提示用户授予权限。

(三)如何声明一个权限?

应用程序必须通过在清单文件(AndroidManifest.xml)中使用 <uses-permission> 标记来公布它需要的权限。例如声明网络访问权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.myapp">
	//声明网络访问权限
    <uses-permission android:name="android.permission.INTERNET"/>

    <application ...>
        ...
    </application>
</manifest>

如果在应用程序的清单文件中列出的是正常的权限(即不会对用户隐私或设备操作造成太大风险的权限),系统会自动将这些权限授予给应用程序。

如果在应用程序的清单中列出的是危险的权限(即可能影响用户隐私或设备正常操作的权限),则必须经过用户的同意才能授权相应的权限。

(四)Android 不同版本对危险权限的处理方式

Android 请求用户授予危险权限的方式取决于用户设备上运行的 Android 版本,以及我们在应用中设置的 targetSdkVersion 。主要有两种处理方式:

  • 运行时请求:Android 6.0 以及更高的版本
  • 安装时请求:Android 5.1.1 以及更低的版本
  1. 运行时请求:

如果手机 Android 系统的版本是 6.0 (API级别23) 或者更高,而应用程序的 targetSdkVersion 是 23 或者更高,用户在安装时不会收到任何应用程序权限通知。应用程序必须要求用户在运行时授予危险的权限。当应用程序请求权限时,用户会看到一个系统对话框,告诉用户应用程序试图访问哪个权限组。对话框包含一个拒绝和允许按钮。

如果用户拒绝权限请求,那么下一次应用程序请求该权限时,对话框将包含一个复选框,选中该复选框后,用户不会再收到权限申请提示。

下面通过申请拍照权限为例:

运行时请求
可以看到,第一次弹框时选择拒绝,第二次弹框出现了一个“不再询问”的复选框,勾选以后,再次拒绝,则之后都不会再弹出权限申请的对话框。

假如用户选择了“允许”,也不能表示应用就会一直拥有该权限。用户还可以进入系统设置页面,将之前那授予的权限关闭掉,因此,我们在开发中必须在运行时去检查和申请相应的权限,以防止在运行时出现 SecurityException 的错误,导致应用奔溃。

  1. 安装时请求:

如果手机 Android 系统的版本是 5.1.1 (API级别22) 或者更低,而应用程序的 targetSdkVersion 是 22 或者更低,系统会自动要求用户在安装时为应用程序授予所有危险的权限。

安装时请求
如果用户单击 Accept,应用程序请求的所有权限都将被授予。如果用户拒绝权限请求,系统将取消应用程序的安装。如果应用程序更新需要额外的权限,用户在更新应用程序之前会被提示接受这些新的权限。

(五)特殊的两个权限

有两个权限的行为不像正常权限和危险权限:SYSTEM_ALERT_WINDOWWRITE_SETTINGS

这是两个特别敏感的权限,所以大多数应用程序不应该使用它们。如果应用程序需要这些权限之一,它必须在清单中声明该权限,并发送一个意图请求用户的授权。系统通过向用户显示详细的管理屏幕来响应这个意图。

以申请 SYSTEM_ALERT_WINDOW 为例:

step 1:首先在清单文件中声明权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

step 2:申请权限(6.0 及其以上版本)

//在 6.0 以前的系统版本,悬浮窗权限是默认开启的,直接使用即可。 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
	if (!Settings.canDrawOverlays(context)) {
		Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
		startActivity(intent);
		return;
	}
}

请求悬浮窗权限

(六)权限组

Android 系统对所有的危险权限进行了分组,称为 权限组

权限组 权限
CALENDAR READ_CALENDAR
WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

如果手机 Android 系统的版本是 6.0 (API级别23) 或者更高,而应用程序的 targetSdkVersion 是 23 或者更高,则当应用程序请求危险权限时,系统会有如下行为:

如果应用程序当前在权限组中没有任何权限,则系统向描述应用程序希望访问的权限组的用户显示权限请求对话框。对话框没有描述该组中的特定权限。例如,如果一个应用程序请求READ_CONTACTS权限,系统对话框只告诉应用程序需要访问设备的联系人。如果用户给予批准,系统只会给应用程序它所请求的权限。
如果应用程序已经在同一权限组中被授予了另一个危险权限,系统会立即授予该权限,而不与用户进行任何交互。例如,如果一个应用程序之前请求并被授予了READ_CONTACTS权限,然后它请求WRITE_CONTACTS,系统立即授予该权限,而不向用户显示权限对话框。

上面是官方的原话,简而言之就是:属于同一组的危险权限将自动合并授予,用户授予应用某个权限组的权限,则应用将获得该权限组下的所有权限(前提是相关权限在 AndroidManifest.xml 中有声明)。

然而事实真的如此吗?我们来试验一下属于同一个权限组下的 READ_CONTACTS 权限和 WRITE_CONTACTS 权限。按照官方的说法,如果我先授权了 READ_CONTACTS 权限,那么 WRITE_CONTACTS 权限会被自动授予,我们来看看实际运行的效果:
权限组
可以看到,当我们先授予了 READ_CONTACTS 权限后,再去申请 WRITE_CONTACTS 权限时,依旧弹出了对话框让用户授权,这明显和官方文档说明的不一致。但是同时官方建议我们,不要将应用程序的逻辑建立在这些权限组的结构上,因为在未来的版本中,可能会将一个特定的权限从一个组移动到另一个组,因此,我们的代码逻辑不应该依赖权限组,而是应该显式地请求它需要的每个权限,即使用户已经在同一组中授予了另一个权限。

二、如何请求权限

每款 Android 应用都在访问受限的沙盒中运行。如果应用需要使用其自己的沙盒外的资源或信息,则必须请求相应权限。 要声明应用需要某项权限,可以在应用清单中列出该权限,然后在运行时请求用户批准每项权限(适用于 Android 6.0 及更高版本)。

(一)向清单文件添加权限

无论应用需要什么权限,都需要在清单文件中对权限进行声明。系统会根据声明权限的敏感程度采取不同的操作。有些权限被视为“常规”权限,系统会在安装应用时立即授予这些权限。还有些则被视为“危险”权限,需要用户明确授予相应访问权限。

(二)检查权限

如果应用需要一项危险权限,那么每次执行需要该权限的操作时,都必须检查自己是否具有该权限。从 Android 6.0(API 级别 23)开始,用户可随时从任何应用撤消权限,即使应用以较低的 API 级别为目标平台也是如此。因此,即使应用昨天使用了相机,也不能认为它今天仍具有该权限。

要检查应用是否具有某项权限,请调用 ContextCompat.checkSelfPermission() 方法。例如,以下代码段展示了如何检查 Activity 是否具有向日历写入数据的权限:

    if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR)
            != PackageManager.PERMISSION_GRANTED) {
        // Permission is not granted
    }

如果应用具有此权限,该方法将返回 PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具备此权限,该方法将返回 PERMISSION_DENIED,且应用必须明确要求用户授予权限。

(三)请求权限

当应用从 checkSelfPermission() 收到 PERMISSION_DENIED 时,需要提示用户授予该权限。Android 提供了几种可用来请求权限的方法(如 requestPermissions()),如下面的代码段所示。调用这些方法时,会显示一个无法自定义的标准 Android 对话框。

    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {

        // Permission is not granted
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.READ_CONTACTS)) {
            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
        } else {
            // No explanation needed; request the permission
            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    } else {
        // Permission has already been granted
    }

在某些情况下,需要帮助用户理解为什么应用需要某项权限。例如,如果用户启动一款摄影应用,用户或许不会对该应用请求使用相机的权限感到惊讶,但用户可能不理解为什么该应用想要访问用户的位置或联系人。在应用请求权限之前,可以向用户提供解释。一种比较好的做法是在用户之前拒绝过该权限请求的情况下提供解释。我们通过调用 shouldShowRequestPermissionRationale() 方法来实现。如果用户之前拒绝了该请求,该方法将返回 true。如果用户之前拒绝了该权限并且选中了权限请求对话框中的不再询问选项,或者如果设备政策禁止该权限,该方法将返回 false(注意,如果用户拒绝了该权限,并且勾选了“不再询问”,即使在返回false的逻辑中调用了requestPermissions方法,系统也不会再弹出选择框)。

(四)处理权限请求响应

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }

            // other 'case' lines to check for other
            // permissions this app might request.
        }
    }

三、自定义权限

(一)背景

Android 是一个特权分离的操作系统,其中每个应用程序都使用一个唯一的系统标识(Linux 用户 ID 和 组 ID)运行。系统也被称不同的部分,每个部分都有自己的标识。因此,Linux 将应用程序彼此隔离,并与系统隔离。应用程序可以自定义权限来提供给其他应用程序访问自己的功能。

(二)如何自定义权限

要自定义权限,可以在 AndroidManifest.xml 中使用 <permission> 标签来声明。

<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.myapp" >
    
    <permission
      android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
      android:label="@string/permlab_deadlyActivity"
      android:description="@string/permdesc_deadlyActivity"
      android:permissionGroup="android.permission-group.COST_MONEY"
      android:protectionLevel="dangerous" />
    ...
</manifest>

属性解释:

  1. name:自定义权限的名字。如果其他 app 引用该权限需要填写这个名字。
  2. lable:标签,用于描述该权限保护的关键功能(尽量简短)。显示给用户的,它的值可是一个 string 数据。
  3. description:描述,比 label 更长的对权限的描述。值是通过 resource 文件中获取的,不能直接写 string 值。
  4. permissionGroup:权限组,可选属性。在大多数情况下,应该将其设置为一个标准系统组(android.Manifest.permission_group),尽管可以自己定义一个组。
  5. protectionLevel:保护级别,它是必须的属性。

下面我们来写一个具体的例子:我们在进程1中定义一个 Activity,并为该 Activity 设置访问权限,然后让进程2来访问它。

进程1:

AndroidManifest.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.chenyouyu.permissiondemo">
	
	//自定义的权限,权限级别为 normal
    <permission
        android:name="com.example.myapp.permission.SECOND_ACTIVITY"
        android:label="abc"
        android:description="@string/permdesc_SecondActivity"
        android:permissionGroup="android.permission-group.COST_MONEY"
        android:protectionLevel="normal" />

    <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/AppTheme">
        //为SecondActivity加上android:permission="com.example.myapp.permission.SECOND_ACTIVITY"
        <activity
            android:name=".SecondActivity"
            android:exported="true"
            android:permission="com.example.myapp.permission.SECOND_ACTIVITY">
            <intent-filter>
                <action android:name="com.cyy.jump" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
		......
</manifest>

进程2:

AndroidManifest.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.chenyouyu.permissiondemo2">
	//在AndroidManifest中声明权限
    <uses-permission android:name="com.example.myapp.permission.SECOND_ACTIVITY"/>

    <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/AppTheme">
        <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

Intent intent = new Intent();
intent.setAction("com.cyy.jump");
intent.addCategory(Intent.CATEGORY_DEFAULT);
if (intent.resolveActivity(getPackageManager()) != null) {
	startActivity(intent);
}

首先运行进程1,然后运行进程2。
自定义权限

(三)自定义权限注意点

1.两个应用声明了相同的权限

Android 不允许两个不同的应用定义一个相同名字的权限(除非这两个应用拥有相同的签名),所以在命名的时候,需要特别注意。拥有相同自定义权限的软件必须使用同样的签名,否则后一个程序无法安装。

2.和应用安装顺序的关系。

场景:App A中声明了权限PermissionA,App B中使用了权限PermissionA。

情况一:PermissionA的保护级别是normal或者dangerous
App B先安装,App A后安装,此时App B无法获取PermissionA的权限,从App B打开App A会报权限错误。
App A先安装,App B后安装,从App B打开App A一切正常。

情况二:PermissionA的保护级别是signature或者signatureOrSystem
App B先安装,App A后安装,如果App A和App B是相同的签名,那么App B可以获取到PermissionA的权限。如果App A和App B的签名不同,则App B获取不到PermissionA权限。即,对于相同签名的app来说,不论安装先后,只要是声明了权限,请求该权限的app就会获得该权限。

这也说明了对于具有相同签名的系统app来说,安装过程不会考虑权限依赖的情况。安装系统app时,按照某个顺序(例如名字排序,目录位置排序等)安装即可,等所有app安装完了,所有使用权限的app都会获得权限。

3.权限的获取以及版本兼容

Android6.0引入了动态权限,这个大家都知道了。前面说到的自定义的权限的安全级别android:protectionLevel会影响权限在Android6.0+系统的使用

android:protectionLevel=“normal”,不需要动态申请
android:protectionLevel=“dangerous”,需要动态申请

参考文章:

  1. https://blog.csdn.net/bingducaijun/article/details/79308479
  2. https://www.jianshu.com/p/b60cde583237
2015-02-28 11:33:47 true100 阅读数 4080
  • Android应用开发进阶与实践

    本课程是Android应用开发的进阶篇,以实践为主,学习本课程要求学习者首先掌握Java基础,Android开发基础,此课程在此基础上进一步探索,此课程不适合没有Java和Android基础的人员。

    7078 人正在学习 去看看 刘安战

android应用开发中,不得不涉及到权限PERMISSION问题,我们在每一个应用的清单文件AndroidManifest.xml都要对需要用到的权限进行配置,否则就不能正常运行我们开发的APK!网上收集的关于Android uses-permission的一些起资料,很多常用的大家都知道,也有不常用的,同大家分享:

android.permission.INTERNET 

最常用的权限之一:网络权限,允许程序打开网络套接字(Allows applications to open network sockets) 

android.permission.ACCESS_WIFI_STATE 
允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks) 

android.permission.BATTERY_STATS 
允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics) 

android.permission.ACCESS_NETWORK_STATE 
允许程序访问有关GSM网络信息(Allows applications to access information about networks) 

android.permission.ACCESS_CHECKIN_PROPERTIES 
允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded) 
android.permission.ACCESS_COARSE_LOCATION 
允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location) 
android.permission.ACCESS_FINE_LOCATION 
允许一个程序访问精确位置(如GPS) (Allows an application to access fine (e.g., GPS) location) 
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 
允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands) 
android.permission.ACCESS_MOCK_LOCATION 
允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing) 
android.permission.ACCESS_SURFACE_FLINGER 
允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceFlinger’s low level features) 
android.permission.ADD_SYSTEM_SERVICE 
允许程序发布系统级服务(Allows an application to publish system-level services). 
android.permission.BLUETOOTH 
允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices) 
android.permission.BLUETOOTH_ADMIN 
允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices) 
android.permission.BROADCAST_STICKY 
允许一个程序广播常用intents(Allows an application to broadcast sticky intents) 
android.permission.BROADCAST_PACKAGE_REMOVED 
允许程序广播一个提示消息在一个应用程序包已经移除后(Allows an application to broadcast a notification that an application 

package has been removed) 

android.permission.CHANGE_NETWORK_STATE 
允许程序改变网络连接状态(Allows applications to change network connectivity state) 
android.permission.CHANGE_WIFI_STATE 
允许程序改变Wi-Fi连接状态(Allows applications to change Wi-Fi connectivity state) 

android.permission.CALL_PHONE 
允许一个程序电话拨号不需通过拨号用户界面需要用户确认(Allows an application to initiate a phone call without going through the Dialer user interface for the user to confirm the call being placed.) 
android.permission.CALL_PRIVILEGED 
允许一个程序拨打任何号码,包含紧急号码无需通过拨号用户界面需要用户确认(Allows an application to call any phone number, including emergency numbers, without going through the Dialer user interface for the user to confirm the call being placed) 
android.permission.CAMERA 
请求访问使用照相设备(Required to be able to access the camera device. ) 
android.permission.CHANGE_CONFIGURATION 
允许一个程序修改当前设置,如本地化(Allows an application to modify the current configuration, such as locale. ) 
android.permission.CLEAR_APP_CACHE 
允许一个程序清楚缓存从所有安装的程序在设备中(Allows an application to clear the caches of all installed applications on the device. ) 
android.permission.CLEAR_APP_USER_DATA 
允许一个程序清除用户设置(Allows an application to clear user data) 
android.permission.CONTROL_LOCATION_UPDATES 
允许启用禁止位置更新提示从无线模块(Allows enabling/disabling location update notifications from the radio. ) 
android.permission.DELETE_CACHE_FILES 
允许程序删除缓存文件(Allows an application to delete cache files) 
android.permission.DELETE_PACKAGES 
允许一个程序删除包(Allows an application to delete packages) 
android.permission.DEVICE_POWER 
允许访问底层电源管理(Allows low-level access to power management) 
android.permission.DISABLE_KEYGUARD 
允许程序禁用键盘锁(Allows applications to disable the keyguard ) 
android.permission.DUMP 
允许程序返回状态抓取信息从系统服务(Allows an application to retrieve state dump information from system services.) 
android.permission.FACTORY_TEST 
作为一个工厂测试程序,运行在root用户(Run as a manufacturer test application, running as the root user. ) 
android.permission.FLASHLIGHT 
访问闪光灯,android开发网提示HTC Dream不包含闪光灯(Allows access to the flashlight ) 
android.permission.FORCE_BACK 
允许程序强行一个后退操作是否在顶层activities(Allows an application to force a BACK operation on whatever is the top activity. ) 
android.permission.FOTA_UPDATE 
暂时不了解这是做什么使用的,android开发网分析可能是一个预留权限. 
android.permission.GET_ACCOUNTS 
访问一个帐户列表(Allows access to the list of accounts in the Accounts Service) 
android.permission.GET_PACKAGE_SIZE 
允许一个程序获取任何package占用空间容量(Allows an application to find out the space used by any package. )
android.permission.GET_TASKS 
允许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等(Allows an application to get information about the currently or recently running tasks: a thumbnail representation of the tasks, what activities are running in it, etc.) 
android.permission.HARDWARE_TEST 
允许访问硬件(Allows access to hardware peripherals. ) 
android.permission.INJECT_EVENTS 
允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流,android 开发网提醒算是hook技术吧(Allows an application to inject user events (keys, touch, trackball) into the event stream and deliver them to ANY window.) 
android.permission.INSTALL_PACKAGES 
允许一个程序安装packages(Allows an application to install packages. ) 
android.permission.INTERNAL_SYSTEM_WINDOW 
允许打开窗口使用系统用户界面(Allows an application to open windows that are for use by parts of the system user interface. ) 
android.permission.MODIFY_AUDIO_SETTINGS 
允许程序修改全局音频设置(Allows an application to modify global audio settings) 
android.permission.MODIFY_PHONE_STATE 
允许修改话机状态,如电源,人机接口等(Allows modification of the telephony state – power on, mmi, etc. ) 
android.permission.MOUNT_UNMOUNT_FILESYSTEMS 
允许挂载和反挂载文件系统可移动存储(Allows mounting and unmounting file systems for removable storage. ) 
android.permission.PERSISTENT_ACTIVITY 
允许一个程序设置他的activities显示(Allow an application to make its activities persistent. ) 
android.permission.PROCESS_OUTGOING_CALLS 
允许程序监视、修改有关播出电话(Allows an application to monitor, modify, or abort outgoing calls) 
android.permission.READ_CALENDAR 
允许程序读取用户日历数据(Allows an application to read the user’s calendar data.) 
android.permission.READ_CONTACTS 
允许程序读取用户联系人数据(Allows an application to read the user’s contacts data.) 
android.permission.READ_FRAME_BUFFER 
允许程序屏幕波或和更多常规的访问帧缓冲数据(Allows an application to take screen shots and more generally get access to the frame buffer data) 
android.permission.READ_INPUT_STATE 
允许程序返回当前按键状态(Allows an application to retrieve the current state of keys and switches. ) 
android.permission.READ_LOGS 
允许程序读取底层系统日志文件(Allows an application to read the low-level system log files. ) 
android.permission.READ_OWNER_DATA 
允许程序读取所有者数据(Allows an application to read the owner’s data) 
android.permission.READ_SMS 
允许程序读取短信息(Allows an application to read SMS messages.) 
android.permission.READ_SYNC_SETTINGS 
允许程序读取同步设置(Allows applications to read the sync settings) 
android.permission.READ_SYNC_STATS 
允许程序读取同步状态(Allows applications to read the sync stats) 
android.permission.REBOOT 
请求能够重新启动设备(Required to be able to reboot the device. ) 
android.permission.RECEIVE_BOOT_COMPLETED 
允许一个程序接收到 ACTION_BOOT_COMPLETED广播在系统完成启动(Allows an application to receive the ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. ) 
android.permission.RECEIVE_MMS 
允许一个程序监控将收到MMS彩信,记录或处理(Allows an application to monitor incoming MMS messages, to record or perform processing on them. ) 
android.permission.RECEIVE_SMS 
允许程序监控一个将收到短信息,记录或处理(Allows an application to monitor incoming SMS messages, to record or perform processing on them.) 
android.permission.RECEIVE_WAP_PUSH 
允许程序监控将收到WAP PUSH信息(Allows an application to monitor incoming WAP push messages. ) 
android.permission.RECORD_AUDIO 
允许程序录制音频(Allows an application to record audio) 
android.permission.RESTART_PACKAGES 
允许程序重新启动其他程序(Allows an application to restart other applications) 
android.permission.SEND_SMS 
允许程序发送SMS短信(Allows an application to send SMS messages) 
android.permission.SET_ACTIVITY_WATCHER 
允许程序监控或控制activities已经启动全局系统中(Allows an application to watch and control how activities are started globally in the system.) 
android.permission.SET_ALWAYS_FINISH 
允许程序控制是否活动间接完成在处于后台时(Allows an application to control whether activities are immediately finished when put in the background.) 
android.permission.SET_ANIMATION_SCALE 
修改全局信息比例(Modify the global animation scaling factor.) 
android.permission.SET_DEBUG_APP 
配置一个程序用于调试(Configure an application for debugging.) 
android.permission.SET_ORIENTATION 
允许底层访问设置屏幕方向和实际旋转(Allows low-level access to setting the orientation (actually rotation) of the screen.) 
android.permission.SET_PROCESS_FOREGROUND 
允许程序当前运行程序强行到前台(Allows an application to force any currently running process to be in the foreground.) 
android.permission.SET_PROCESS_LIMIT 
允许设置最大的运行进程数量(Allows an application to set the maximum number of (not needed) application processes that can be running. ) 
android.permission.SET_TIME_ZONE 
允许程序设置时间区域(Allows applications to set the system time zone)
android.permission.SET_WALLPAPER 
允许程序设置壁纸(Allows applications to set the wallpaper ) 
android.permission.SET_WALLPAPER_HINTS 
允许程序设置壁纸hits(Allows applications to set the wallpaper hints) 
android.permission.SIGNAL_PERSISTENT_PROCESSES 
允许程序请求发送信号到所有显示的进程中(Allow an application to request that a signal be sent to all persistent processes) 
android.permission.STATUS_BAR 
允许程序打开、关闭或禁用状态栏及图标Allows an application to open, close, or disable the status bar and its icons. 
android.permission.SUBSCRIBED_FEEDS_READ 
允许一个程序访问订阅RSS Feed内容提供(Allows an application to allow access the subscribed feeds ContentProvider. ) 
android.permission.SUBSCRIBED_FEEDS_WRITE 
系统暂时保留改设置,android开发网认为未来版本会加入该功能。 
android.permission.SYSTEM_ALERT_WINDOW 
允许一个程序打开窗口使用 TYPE_SYSTEM_ALERT,显示在其他所有程序的顶层(Allows an application to open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. ) 
android.permission.VIBRATE 
允许访问振动设备(Allows access to the vibrator) 
android.permission.WAKE_LOCK 
允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失( Allows using PowerManager WakeLocks to keep processor from sleeping or screen from dimming) 
android.permission.WRITE_APN_SETTINGS 
允许程序写入API设置(Allows applications to write the apn settings) 
android.permission.WRITE_CALENDAR 
允许一个程序写入但不读取用户日历数据(Allows an application to write (but not read) the user’s calendar data. )
android.permission.WRITE_CONTACTS 
允许程序写入但不读取用户联系人数据(Allows an application to write (but not read) the user’s contacts data. ) 
android.permission.WRITE_GSERVICES 
允许程序修改Google服务地图(Allows an application to modify the Google service map. ) 
android.permission.WRITE_OWNER_DATA 
允许一个程序写入但不读取所有者数据(Allows an application to write (but not read) the owner’s data.) 
android.permission.WRITE_SETTINGS 
允许程序读取或写入系统设置(Allows an application to read or write the system settings. ) 
android.permission.WRITE_SMS 
允许程序写短信(Allows an application to write SMS messages) 
android.permission.WRITE_SYNC_SETTINGS 
允许程序写入同步设置(Allows applications to write the sync settings) 

Android应用权限

阅读数 232

没有更多推荐了,返回首页