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

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. 深入浅出ClassLoader

    你真的了解ClassLoader吗? 这篇文章翻译自zeroturnaround.com的 Do You Really Get Classloaders? ,融入和补充了笔者的一些实践.经验和样例.本 ...

  2. Kotlin 语言高级安卓开发入门

    过去一年,使用 Kotlin 来为安卓开发的人越来越多.即使那些现在还没有使用这个语言的开发者,也会对这个语言的精髓产生共鸣,它给现在 Java 开发增加了简单并且强大的范式.Jake Wharton ...

  3. 零基础编程指南(By Turtle)

    [零.基础] 1.看文章:<程序猿搜索的技巧>(未完成) [一.入门] 学习语言:VB 安装:下载VB6即可 教程:<李天生vb从入门到精通>http://www.xin372 ...

  4. excel用vlookup,lookup时查询数据需要排序

    如题,排出来的数据不对,之前没有是看清楚..所以记下来,日是后要小心点....

  5. tcprstat的使用方式

    两种使用方式:1)本机直接在线采集:2)分析tcpdump采集到的离线pcap文件   1. 本机直接在线采集 参数:   -p :指定只采集此TCP port的请求   -t  : 采集输出的时间间 ...

  6. codeforces 700B Connecting Universities 贪心dfs

    分析:这个题一眼看上去很难,但是正着做不行,我们换个角度:考虑每条边的贡献 因为是一棵树,所以一条边把树分成两个集合,假如左边有x个学校,右边有y个学校 贪心地想,让每条边在学校的路径上最多,所以贡献 ...

  7. AppServ的安装与配置

    AppServ是一个软件集合,包括Apache(HTTP服务器软件).PHP(网页程序设计语言).MySQL(数据库管理系统软件).phpMyAdmin(图形界面的数据库管理软件)四个组成部分.App ...

  8. DOS功能的调用

    DOS功能的调用:主要包含三方面的子程序:设备驱动(基本I/O),文件管理和其他(包括内存管理,自取时间,自取终端向量,总之程序等)随着DOS版本的升级,这种DOS功能调用的子程序数量也在不断的增加, ...

  9. mvc bundle功能(2)

    配置好Bundle,注册好之后,再是调用 <head> <meta charset="utf-8"> <meta http-equiv="X ...

  10. leetcode—3sum

    1.题目描述 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...