解析Android声明和使用权限_Android

Android定义了一种权限方案来保护设备上的资源和功能。例如,在默认情况下,应用程序无法访问联系人列表、拨打电话等。下面就以拨打电话为例介绍一下系统对权限的要求。一般在我们的应用中,如果要用到拨打电话的功能,我们会这样编码:

Uri uri = Uri.parse("tel:12345678");
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);

默认情况下,我们无权访问拨打电话的Activity,控制台将会报以下异常信息:

ERROR/AndroidRuntime: java.lang.SecurityException: Permission Denial:
starting Intent { act=android.intent.action.CALL dat=tel:12345678 cmp=com.android.phone/.OutgoingCallBroadcaster }
......
requires android.permission.CALL_PHONE 

看来,我们是缺少了CALL_PHONE这个权限,这个权限是Android系统自带的phone应用里定义的权限:

......
<uses-permission android:name="android.permission.CALL_PHONE" />
......
<activity android:name="OutgoingCallBroadcaster"
        android:permission="android.permission.CALL_PHONE"
        android:theme="@android:style/Theme.NoDisplay"
        android:configChanges="orientation|keyboardHidden">
      <!-- CALL action intent filters, for the various ways
         of initiating an outgoing call. -->
      <intent-filter>
        <action android:name="android.intent.action.CALL" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="tel" />
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.CALL" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="voicemail" />
      </intent-filter>
      <intent-filter>
        <action android:name="android.intent.action.CALL" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.item/phone" />
        <data android:mimeType="vnd.android.cursor.item/phone_v2" />
        <data android:mimeType="vnd.android.cursor.item/person" />
      </intent-filter>
</activity>
......

想要使用此功能,必须在我们的AndroidManifest.xml文件中声明使用此权限:

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

这告诉系统,我们的应用使用了此权限,我们有权访问拨打电话的Activity。

我们不仅要问,为什么系统会这样设计呢?答案是为了保护用户资源的安全。要想使用此功能,必须在应用中声明权限信息,这样一来,在用户安装此应用时系统会从应用中提取出权限信息,告诉用户该应用使用到了哪些功能,由用户判断该应用是否损害自己的安全。

接下来由我来演示一下权限的定义和使用,我们建立一个phone项目,项目结构如下:
我们设计的流程是在MainActivity中点击按钮,然后跳转到PhoneActivity中,我们会为PhoneActiivty定义相应的权限。

我们先看一下MainActivity和PhoneActivity的代码:
MainActivity.Java如下:

package com.scott.phone; 

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; 

public class MainActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button btn = (Button) findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        startActivity(new Intent(MainActivity.this, PhoneActivity.class));
      }
    });
  }
}

PhoneActivity.java如下:

package com.scott.phone; 

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView; 

public class PhoneActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);
    tv.setText("Yes! It works.");
    setContentView(tv);
  }
}

最重要的是AndroidManifest.xml文件,我们所有的权限声明配置都在此文件中完成:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.scott.phone"
   android:versionCode="1"
   android:versionName="1.0"> 

  <!-- 声明一个权限 -->
  <permission android:protectionLevel="normal"
        android:name="scott.permission.MY_CALL_PHONE"/> 

  <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MainActivity"
         android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <!-- 为Activity应用已定义的权限 -->
    <activity android:name=".PhoneActivity"
         android:permission="scott.permission.MY_CALL_PHONE">
      <intent-filter>
        <!-- 注意这个action 在其他应用中可使用此action访问此Activity -->
        <action android:name="scott.intent.action.MY_CALL"/>
        <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
    </activity>
  </application>
  <!-- 在同一应用中访问PhoneActivity也需要加上权限 -->
  <uses-permission android:name="scott.permission.MY_CALL_PHONE"/>
  <uses-sdk android:minSdkVersion="8" />
</manifest>

需要注意的是,在声明权限时需要一个android:protectionLevel的属性,它代表“风险级别”。必须是以下值之一:
normal、dangerous、signature、signatureOrSystem。

  • normal表示权限是低风险的,不会对系统、用户或其他应用程序造成危害。
  • dangerous表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限。
  • signature告诉Android,只有当应用程序所用数字签名与声明此权限的应用程序所有数字签名相同时,才能将权限授给它。
  • signatureOrSystem告诉Android,将权限授给具有相同数字签名的应用程序或Android包类,这一级别适用于非常特殊的情况,比如多个供应商需要通过系统影像共享功能时。

另外一个是android:permissionGroup属性,表示一个权限组。可以将权限放在一个组中,但对于自定义权限,应该避免设置此属性。如果确实希望设置此属性,可以使用以下属性代替:android.permission-group.SYSTEM_TOOLS。

下面是两个活动的截图:

以上过程都是在一个内部完成的,现在假如我们的这个phone应用作为系统内置的应用,做为开发者,我们新建一个app,然后访问phone应用里的PhoneActivity。app的结构图如下:

我们在MainActivity里放置一个按钮,点击之后跳转到phone应用的PhoneActivity中。MainActivity.java代码如下:

package com.scott.app; 

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; 

public class MainActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button btn = (Button) findViewById(R.id.btn);
    btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent intent = new Intent("scott.intent.action.MY_CALL");
        startActivity(intent);
      }
    });
  }
} 

然后我们需要在AndroidManifest.xml文件中配置相应的权限:

<application ...>
...
</application>
<uses-permission android:name="scott.permission.MY_CALL_PHONE"/>

点击按钮,就可以顺利地跳转到PhoneActivity了。截图如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android权限声明
android权限管理
android 权限声明、android使用网络权限、android 使用相机权限、android 使用wifi权限、ionic权限声明,以便于您获取更多的相关知识。

时间: 2024-09-28 21:18:43

解析Android声明和使用权限_Android的相关文章

解析Android声明和使用权限

Android定义了一种权限方案来保护设备上的资源和功能.例如,在默认情况下,应用程序无法访问联系人列表.拨打电话等.下面就以拨打电话为例介绍一下系统对权限的要求.一般在我们的应用中,如果要用到拨打电话的功能,我们会这样编码: Uri uri = Uri.parse("tel:12345678"); Intent intent = new Intent(Intent.ACTION_CALL, uri); startActivity(intent); 默认情况下,我们无权访问拨打电话的A

我的Android进阶之旅------&amp;gt;Android声明和使用权限

Android定义了一种权限方案来保护设备上的资源和功能.例如,在默认情况下,应用程序无法访问联系人列表.拨打电话等.下面就以拨打电话为例介绍一下系统对权限的要求.一般在我们的应用中,如果要用到拨打电话的功能,我们会这样编码: [java] view plaincopyprint? Uri uri = Uri.parse("tel:12345678");  Intent intent = new Intent(Intent.ACTION_CALL, uri);  startActivi

深入解析Android中的RecyclerView组件_Android

前些日子,组里为了在目前的Android程序里实现基于ListView子项的动画效果,希望将最新的RecyclerView引入到程序中,于是我便花了一些时间研究了一下RecyclerView的基本情况.本文算是对这些日子里了解的内容做一些汇总. 在网上关于RecyclerView的基本使用方式已经有了比较详细介绍,而且其设计结构也类似于ListView,所以本文将不重点介绍如何使用,在文末的引用中都可以相关内容.这里主要是介绍RecyclerView的基本功能.设计理念,以及系统提供API的情况

解析android中ProgressBar的用法_Android

范例说明Android的Widget,有许多是为了与User交互而特别设计的,但也有部分是作为程序提示.显示程序运行状态的Widget.现在介绍的范例,与前一章介绍过的ProgressDialog对话框的应用目的相似,但由于前章介绍的ProgressDialog是继承自Android.app.ProgressDialog所设计的互动对话窗口,在应用时,必须新建ProgressDialog对象,在运行时会弹出"对话框"作为提醒,此时应用程序后台失去焦点,直到进程结束后,才会将控制权交给应

解析Android中的Serializable序列化_Android

1.为何要序列化? -- 把内存中的java对象能够在磁盘上持久保存 -- 通过网络传输对象 -- 通过RMI(Remote Method Invocation 远程过程调用)传输. 通过序列化可以把对象转化为与平台无关的二进制流,在重新使用前进行反序列化,重新转化为java对象. (远程过程调用针对分布式Java应用,对开发人员屏蔽不同JVM和网络连接等细节,是的分布在不同JVM上的对象似乎存在于一个统一的JVM中,能够方便的通讯) 2.如何让Java对象可以被序列化? 在java里只需让目标

深入解析Android App的LayoutInflate布局_Android

1. 题外话  相信大家对LayoutInflate都不陌生,特别在ListView的Adapter的getView方法中基本都会出现,使用inflate方法去加载一个布局,用于ListView的每个Item的布局.Inflate有三个参数,我在初学Android的时候这么理解的: (1)对于Inflate的三个参数(int resource, ViewGroup root, boolean attachToRoot): (2)如果inflate(layoutId, null )则layoutI

解析Android应用程序运行机制_Android

在标准的Windows和Linux桌面操作系统中,同时可以在不同的窗口中运行多个应用程序,每次只有一个应用程序是当前焦点状态,但其他的应用程序都是一个平等的位置.用户可以随时切换每个应用程序,在不需要应用程序时,也需要用户来关闭应用程序.     但是Android操作系统的应用程序却不是采用这种方式.     Android中每次只有一个应用程序运行在最前面,除了状态栏的位置,当前应用程序将铺满整个屏幕.用户最常见的应用程序就是应用的主页(Home application),这个程序主要显示背

深入解析Android App开发中Context的用法_Android

Context在开发Android应用的过程中扮演着非常重要的角色,比如启动一个Activity需要使用context.startActivity方法,将一个xml文件转换为一个View对象也需要使用Context对象,可以这么说,离开了这个类,Android开发寸步难行,对于这样一个类,我们又对他了解多少呢.我就说说我的感受吧,在刚开始学习Android开发时,感觉使用Context的地方一直就是传入一个Activity对象,久而久之感觉只要是Context的地方就传入一个Activity就行

浅析Android 手机卫士设备管理权限锁屏_Android

推荐阅读: 浅析Android手机卫士sim卡绑定 深入浅析Android手机卫士保存密码时进行md5加密 详解Android 手机卫士设置向导页面 浅析Android手机卫士关闭自动更新 浅析Android手机卫士自定义控件的属性 浅析Android手机卫士读取联系人 浅析Android手机卫士接收短信指令执行相应操作 浅析Android手机卫士手机定位的原理 浅析Android手机卫士之手机实现短信指令获取位置 设备管理员 Device Admin 获取DevicePolicyManager