每日一贴,今天的内容关键字为权限检查

ProfileProvider继承自AbstractContyactsProvider。

源代码请自行下载

    每日一道理
书籍好比一架梯子,它能引领人们登上文化的殿堂;书籍如同一把钥匙,它将帮助我们开启心灵的智慧之窗;书籍犹如一条小船,它会载着我们驶向知识的海洋。
package com.android.providers.contacts;

import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri; import java.io.FileNotFoundException;
import java.util.Locale; /**
* Simple content provider to handle directing profile-specific calls against a separate
* database from the rest of contacts.
*/
public class ProfileProvider extends AbstractContactsProvider { private static final String READ_PERMISSION = "android.permission.READ_PROFILE";
private static final String WRITE_PERMISSION = "android.permission.WRITE_PROFILE"; // The Contacts provider handles most of the logic - this provider is only invoked when the
// URI belongs to a profile action, setting up the proper database.
private final ContactsProvider2 mDelegate; public ProfileProvider(ContactsProvider2 delegate) {
mDelegate = delegate;
} /**
* Performs a permission check on the read profile permission. Checks the delegate contacts
* provider to see whether this is an authorized one-time-use URI.
* @param uri The URI being accessed.
*/
public void enforceReadPermission(Uri uri) {//检查是不是有读权限
if (!mDelegate.isValidPreAuthorizedUri(uri)) {
mDelegate.getContext().enforceCallingOrSelfPermission(READ_PERMISSION, null);
}
} /**
* Performs a permission check on the write profile permission.
*/
public void enforceWritePermission() {//检查是不是有写权限
mDelegate.getContext().enforceCallingOrSelfPermission(WRITE_PERMISSION, null);
}
/**
* 重写getDatabaseHelper,父类的方法
*/
@Override
protected ProfileDatabaseHelper getDatabaseHelper(Context context) {
return ProfileDatabaseHelper.getInstance(context);
} @Override
protected ThreadLocal<ContactsTransaction> getTransactionHolder() {//得到线程当地存储的对象
return mDelegate.getTransactionHolder();
} @Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
enforceReadPermission(uri);//检查权限,如果没有权限抛出异常
mDelegate.substituteDb(getDatabaseHelper().getReadableDatabase());//替换数据库 profile.db
return mDelegate.queryLocal(uri, projection, selection, selectionArgs, sortOrder, -1);
} @Override
protected Uri insertInTransaction(Uri uri, ContentValues values) {
enforceWritePermission();//检查写权限,如果不存在权限,抛出异常
useProfileDbForTransaction();//启动触发器,并切换数据库到profile.db
return mDelegate.insertInTransaction(uri, values);
} @Override
protected int updateInTransaction(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
enforceWritePermission();//检查写权限,如果不存在权限,抛出异常
useProfileDbForTransaction();//启动触发器,并切换数据库到profile.db
return mDelegate.updateInTransaction(uri, values, selection, selectionArgs);
} @Override
protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {
enforceWritePermission();//检查写权限,如果不存在权限,抛出异常
useProfileDbForTransaction();//启动触发器,并切换数据库到profile.db
return mDelegate.deleteInTransaction(uri, selection, selectionArgs);
} @Override
public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
if (mode != null && mode.contains("w")) {
enforceWritePermission();//检查写权限,如果不存在权限,抛出异常
mDelegate.substituteDb(getDatabaseHelper().getWritableDatabase());//切换到profile.db上
} else {
enforceReadPermission(uri);//检查权限,如果不存在权限,抛出异常
mDelegate.substituteDb(getDatabaseHelper().getReadableDatabase());
}
return mDelegate.openAssetFileLocal(uri, mode);
} private void useProfileDbForTransaction() {
ContactsTransaction transaction = getCurrentTransaction();//得到线程当地存储,mTreasactionLocal来自mDelegate对象
SQLiteDatabase db = getDatabaseHelper().getWritableDatabase();//子类重写了getDatabaseHelper()方法 profile.db。
transaction.startTransactionForDb(db, ContactsProvider2.PROFILE_DB_TAG, this);
mDelegate.substituteDb(db);//切换数据库到profile.db
} @Override
protected void notifyChange() {
mDelegate.notifyChange();
} protected void notifyChange(boolean syncToNetwork) {
mDelegate.notifyChange(syncToNetwork);
} protected Locale getLocale() {
return mDelegate.getLocale();
} public void onBegin() {
mDelegate.switchToProfileMode();
mDelegate.onBegin();
} public void onCommit() {
mDelegate.switchToProfileMode();
mDelegate.onCommit();
} @Override
public void onRollback() {
mDelegate.switchToProfileMode();
mDelegate.onRollback();
} @Override
protected boolean yield(ContactsTransaction transaction) {
return mDelegate.yield(transaction);
} @Override
public String getType(Uri uri) {
return mDelegate.getType(uri);
}
}

文章结束给大家分享下程序员的一些笑话语录:

这个世界上只有10种人:懂得二进制的和不懂得二进制的。

---------------------------------
原创文章 By
权限和检查
---------------------------------

权限检查联系人ProfileProvider的更多相关文章

  1. Android之运行时相机权限和联系人权限获取

    原文:Android之运行时相机权限和联系人权限获取 本文链接:http://blog.csdn.net/qq_16628781/article/details/61623502 Android之运行 ...

  2. Android 开发技巧 - Android 6.0 以上权限大坑和权限检查基类封装

    简单介绍 关于运行时权限的说法,早在Google发布android 6.0的时候,大家也听得蛮多的.从用户的角度来讲,用户是受益方,更好的保护用户的意思,而对于开发者来说,无疑增加了工作量. 对于6. ...

  3. MVC用户登陆验证及权限检查(Form认证)

    1.配置Web.conf,使用Form认证方式   <system.web>     <authentication mode="None" />      ...

  4. 实例:ABAP权限对象设计与权限检查的实现(详细)

    学习总结,分享给大家,,,(有图有真像) 我在ECC里创建了一张表,随意插入了5条数据 创建权限对象,使分配这个权限的用户只能操作部门编号(edept)为 ‘10’ 的数据. 1. SU20,创建权限 ...

  5. Mysql 存储过程、函数、触发器和视图的权限检查

    当存储过程.函数.触发器和视图创建后,不单单创建者要执行,其它用户也可能需要执行,换句话说,执行者有可能不是创建者本身,那么在执行存储过程时,MySQL是如何做权限检查的? 在默认情况下,MySQL将 ...

  6. asp.net 使用IHttpModule 做权限检查 登录超时检查(转)

    IHttpModule 权限 检查 登录超时检查 这样就不需要每个页面都做一次检查 也不需要继承任何父类. using System;using System.Collections.Generic; ...

  7. Mysql高级之权限检查原理

    原文:Mysql高级之权限检查原理 用户进行数据库操作分为两步: 1 是否有权限连接,根据host,name,password: 2 是否有权限进行CURD: 图示解说: 关于用户权限在哪里进行存放? ...

  8. aspectj 简单的模拟权限检查、事务、日志记录

    package com.ij34.service; public class Hello { public void he() { System.out.println("执行Hello的h ...

  9. SAP跳过权限检查/前提是有debug权限

    SE37,AUTH_CHECK_TCODE加断点: 执行事务代码,进入断点,修改sy-subrc = 0,执行,就可以跳过权限检查. 只给了事务代码权限,没有操作权限: CL_SUID_TOOLS== ...

随机推荐

  1. Linux 平台下 YUM 源配置 手册

    Redhat/Centos 系的Linux 平台,推荐使用YUM 来安装相关依赖包. 安装方式有两种,一种是使用本地的YUM,一种使用在线的YUM. 1         在线YUM 源 如果操作系统能 ...

  2. TCP/IP详解学习笔记(11)-TCP交互数据流,成块数据流

    目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大 ...

  3. oracle返回多结果集

    kavy 原文 oracle返回多结果集 Oracle存储过程: create or replace procedure P_Sel_TopCount2(in_top in number, out_c ...

  4. webdriver(python)学习笔记五——层级定位

    层级定位 在实际的项目测试中,经常会有这样的需求:页面上有很多个属性基本相同的元素,现在需要具体定位到其中的一个.由于属性基本相当,所以在定位的时候会有些麻烦,这时候就需要用到层级定位.先定位父元素, ...

  5. hdu 3336 count the string(KMP+dp)

    题意: 求给定字符串,包含的其前缀的数量. 分析: 就是求所有前缀在字符串出现的次数的和,可以用KMP的性质,以j结尾的串包含的串的数量,就是next[j]结尾串包含前缀的数量再加上自身是前缀,dp[ ...

  6. FOJ2022车站 线段树区间合并

    http://acm.fzu.edu.cn/problem.php?pid=2022 刚开始MLE,用map对应,果断爆内存了,然后改用去重,离散化, lowbound查找元素位置,速度还不错,不过p ...

  7. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  8. Tkinter教程之Message篇

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1811326 '''Tkinter教程之Message篇'''#Message也是用来显示文本的 ...

  9. [转] Web前端优化之 Server篇

    原文链接: http://lunax.info/archives/3093.html Web 前端优化最佳实践第二部分面向 Server .目前共计有 6 条实践规则.[注,这最多算技术笔记,查看最原 ...

  10. Tomcat 下配置OpenLayers proxy.cgi代理

    摘要:在OpenLayers访问WFS服务时,会遇到跨域的问题而导致服务无法访问.此时,需要在应用程序中设置代理,通过代理进行访问.本文介绍在tomcat进行proxy.cgi文件配置,以及在调用代理 ...