非默认短信应用 修改smsprovider数据库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lf12345678910/article/details/72772195

05-27 09:03:04.337  7079  7254 D ContentResolver: java.lang.RuntimeException: here
05-27 09:03:04.337  7079  7254 D ContentResolver:       at android.content.ContentResolver.delete(ContentResolver.java:1371)
05-27 09:03:04.337  7079  7254 D ContentResolver:       at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:105)
05-27 09:03:04.337  7079  7254 D ContentResolver:       at android.os.Handler.dispatchMessage(Handler.java:102)
05-27 09:03:04.337  7079  7254 D ContentResolver:       at android.os.Looper.loop(Looper.java:154)
05-27 09:03:04.337  7079  7254 D ContentResolver:       at android.os.HandlerThread.run(HandlerThread.java:61)
05-27 09:03:04.341  7079  7254 D ContentResolver: delete startTime=246684,provider=android.content.ContentProviderProxy@471e842
05-27 09:03:04.343  5545  6451 D ContentProvider: delete
05-27 09:03:04.343  5545  6451 D ContentProvider: java.lang.RuntimeException: here
05-27 09:03:04.343  5545  6451 D ContentProvider:       at android.content.ContentProvider$Transport.delete(ContentProvider.java:336)
05-27 09:03:04.343  5545  6451 D ContentProvider:       at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:206)
05-27 09:03:04.343  5545  6451 D ContentProvider:       at android.os.Binder.execTransact(Binder.java:565)
05-27 09:03:04.344  5545  6451 D ContentProvider: delete callingPkg=com.android.mms,uri=content://sms/2
05-27 09:03:04.345  5545  6451 D SmsProvider: delete: match: 1,url=content://sms/2,where=null,whereArgs=null
05-27 09:03:04.412  5545  6451 D SmsProvider: delete: ncount: 1,url=content://sms/2
05-27 09:03:04.434  7079  7254 D ContentResolver: delete rowsDeleted=1,mPackageName=com.android.mms

05-27 10:14:37.492  4959  5821 D ContentProvider: delete mode=0,callingPkg=com.android.mmsmWriteOp=15
05-27 10:14:37.492  3449  5307 D AppOps  : resolveProxyPackageNamecom.android.phone
05-27 10:14:37.492  3449  5307 D AppOps  : uidMode0 switchCode 15
05-27 10:14:37.492  3449  5307 D AppOps  : noteOperation: allowing code 15 uid 1001 package com.android.phone
05-27 10:14:37.492  3449  5307 D AppOps  : proxyMode 0
05-27 10:14:37.493  3449  5307 D AppOps  : resolveProxiedPackageNamecom.android.mms
05-27 10:14:37.493  3449  5307 D AppOps  : switchOp.mode0 switchCode 15
05-27 10:14:37.493  3449  5307 D AppOps  : noteOperation: allowing code 15 uid 10024 package com.android.mms

05-27 10:17:16.688  4959  5107 D ContentProvider: delete mode=0,callingPkg=com.xxx.salestrackermWriteOp=15
05-27 10:17:16.689  3449  5610 D AppOps  : resolveProxyPackageNamecom.android.phone
05-27 10:17:16.689  3449  5610 D AppOps  : uidMode0 switchCode 15
05-27 10:17:16.689  3449  5610 D AppOps  : noteOperation: allowing code 15 uid 1001 package com.android.phone
05-27 10:17:16.689  3449  5610 D AppOps  : proxyMode 0
05-27 10:17:16.689  3449  5610 D AppOps  : resolveProxiedPackageNamecom.xxx.salestracker
05-27 10:17:16.689  3449  5610 D AppOps  : switchOp.mode1 switchCode 15
05-27 10:17:16.689  3449  5610 D AppOps  : noteOperation: reject #1 for code 15 (15) uid 1000 package com.hipad.salestracker

1、权限管理机制Android Runtime Permission.

2、Application Permission Manage的功能,该功能应该就是基于AppOps(应用程序权限管理)实现

AppOpsService.java

当应用需要去检查某个权限的时候,会调用checkOp或者noteOp去读取/data/system/appops.xml里面对应的值。

4.常用的接口

接口在AppOpsManager.java中,但大部分只针对系统应用。

  1. public int checkOp(String op, int uid, String packageName)
    检查某个应用(packageName)是否具有某个权限(op)

  2. public int checkOpNoThrow(String op, int uid, String packageName)
    同checkOp,但出错不会报异常,返回MODE_ERRORED

  3. public int noteOp(String op, int uid, String packageName)
    检查某个应用(packageName)是否具有某个权限(op),同时会做记录

  4. public int noteOpNoThrow(String op, int uid, String packageName)
    同checkOp,但出错不会报异常,返回MODE_ERRORED

  5. /* @hide /
    public void setMode(int code, int uid, String packageName, int mode)
    设置权限,code是权限的标识码,比如OP_READ_CONTACTS, mode是权限的状态,比如MODE_ALLOWED

android/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:2701:        mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler);

ContentProvider.java

//权限检查

    /**
     * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is
     * allowed to perform the given operation.
     */
    public static final int MODE_ALLOWED = 0;

if (enforceWritePermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) {
                return 0;
  }

 private int enforceWritePermission(String callingPkg, Uri uri, IBinder callerToken)throws SecurityException {
            final int mode = enforceWritePermissionInner(uri, callingPkg, callerToken);
            if (mode != MODE_ALLOWED) {
                return mode;
            }
            if (mWriteOp != AppOpsManager.OP_NONE) {
                return mAppOpsManager.noteProxyOp(mWriteOp, callingPkg);
            }
            return AppOpsManager.MODE_ALLOWED;
        }

添加如下代码:

AppOpsManager appOps = (AppOpsManager)getSystemService(APP_OPS_SERVICE); 
ApplicationInfo info = getApplicationInfo(); 
              int mode = appOps.checkOp(AppOpsManager.OP_WRITE_SMS, info.uid, info.processName);
              if (mode != AppOpsManager.MODE_ALLOWED) {
              Log.d(TAG,"xxx mode="+mode+",info.uid="+info.uid+",info.processName="+info.processName);
                  appOps.setMode(AppOpsManager.OP_WRITE_SMS, info.uid, info.processName, AppOpsManager.MODE_ALLOWED);
            }

猜你喜欢

转载自blog.csdn.net/lf12345678910/article/details/72772195