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

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. 【原】cocos2d-x 2.0.4 不支持https协议 CURLE_UNSUPPORTED_PROTOCOL

    我们项目组用的cocos2d-x版本还比较老,各种好的功能不能用. 今天就让我遇到一个问题,使用CCHttpClient发送http请求的时候,https协议的不支持,返回失败信息如下 errorco ...

  2. 解决Jsoup网页抓取过程中需要cookie的问题

    最近在做城觅网的信息抓取,发现城觅网上海与北京的url是一样的.那怎样才确定信息的来源呢?折腾了半天,才发现城觅网是使用cookie的,如果你把网站的cookie禁用了,就无法在上海与北京之间切换了. ...

  3. GitHub上README.md教程

    最近对它的README.md文件颇为感兴趣.便写下这贴,帮助更多的还不会编写README文件的同学们. README文件后缀名为md.md是markdown的缩写,markdown是一种编辑博客的语言 ...

  4. C#主线程等待子线程运行结束

    佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然 ...

  5. hadoop2.0中无法启动datanode的问题

    问题描述:在启动datanode进程时,能成功的启动:但用jps查看进程时,发现进程不存在,下面是在datanode日记文件的错误信息 如下图的截屏所示: 主要原因:发生错误的原因:由于把data放在 ...

  6. 回调函数、Java接口回调 总结

    谈到回调,我们得先从回调函数说起,什么叫回调函数呢? 回调函数是什么? 百度百科的解释:回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用 ...

  7. bjfu1252 贪心

    题目意思是给出一些开区间,这些区间有的相交,有的不相交,问你能否选出一些区间,使这些区间之间都不相交,并且选出的区间数最大. 这是个典型的贪心问题了.按区间的结束位置排序,然后顺序地选取区间,只要当前 ...

  8. DataSet DataTable操作

    DataSet ds = new DataSet();            DataTable dt = new DataTable("OrderList");          ...

  9. C++类与对象

    [1]类的内存问题 类是抽象的,不占用内存,而对象是具体的,占用 存储空间.在一开始时弄清对象和类的关系是十分 重要的.[2]类的声明 如果在类的定义中既不指定private也不指定public,则系 ...

  10. android Loger日志类(获取内置sd卡)

    Android手机自带内部存储路径的获取 原文地址:http://my.oschina.net/liucundong/blog/288183 直接贴代码: public static String g ...