码迷,mamicode.com
首页 > 移动开发 > 详细

Android 7.0 CTA认证蓝牙权限未明示的问题

时间:2020-02-28 18:45:36      阅读:424      评论:0      收藏:0      [点我收藏+]

标签:info   style   proc   not   oca   set   lob   enc   new   

Bluetooth

+++ b/frameworks/base/core/java/com/mediatek/cta/CtaUtils.java
@@ -14,6 +14,7 @@ import android.app.AppGlobals;
 import android.app.AppOpsManager;
 import android.app.IActivityManager;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;//mh.add bt
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
@@ -83,7 +84,7 @@ public class CtaUtils {
                 new String[CtaPermissions.CTA_ADDED_PERMISSION_GROUPS.size()]);
     }
 
-    private static String getCallingPkgName(int pid, int uid) {
+    public static String getCallingPkgName(int pid, int uid) {
         IActivityManager am = ActivityManagerNative.getDefault();
         List runningProcesses = null;
         try {
@@ -104,6 +105,24 @@ public class CtaUtils {
         }
         return null;
     }
+       
+       public static boolean isSystemApp(Context context, String packageName) {
+               PackageManager pm = context.getPackageManager();
+               boolean isSystemApp = false;
+               int uid = Binder.getCallingUid();
+               int userId = UserHandle.getUserId(uid);
+               try {
+                       ApplicationInfo applicationInfo
+                                       = pm.getApplicationInfoAsUser(packageName, 0 /* no flags */, userId);
+                       if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0
+                                       || (applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
+                               isSystemApp = true;
+                       }
+               } catch (PackageManager.NameNotFoundException e) {
+                       Slog.d(TAG, "isSystemApp is false for NameNotFoundException= " + e);
+               }
+               return isSystemApp;
+       }
+++ b/frameworks/base/services/core/java/com/android/server/BluetoothManagerService.java
@@ -69,6 +69,7 @@ import java.util.NoSuchElementException;
 import android.os.SystemProperties;
 
 /// M: CTA requirement - permission control  @{
+import android.content.ActivityNotFoundException;
 import com.mediatek.cta.CtaUtils;
 ///@}
 
@@ -817,8 +818,19 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
                                                 "Need BLUETOOTH ADMIN permission");
         /// M: Permission check for CTA requirement @{
-        CtaUtils.enforceCheckPermission(com.mediatek.Manifest.permission.CTA_ENABLE_BT,
-                "Enable bluetooth");
+        /*CtaUtils.enforceCheckPermission(com.mediatek.Manifest.permission.CTA_ENABLE_BT,
+                "Enable bluetooth");*/
+        int callingUid = Binder.getCallingUid();
+        int callingPid = Binder.getCallingPid();
+        final boolean callerSystem = UserHandle.getAppId(callingUid) == Process.SYSTEM_UID;
+        if (!callerSystem) {
+            String packageName = CtaUtils.getCallingPkgName(callingPid, callingUid);
+            if (!isEnabled() && CtaUtils.isCtaSupported() && !CtaUtils.isSystemApp(mContext,
+                    packageName) && startConsentUiIfNeeded(packageName, callingUid,
+                    BluetoothAdapter.ACTION_REQUEST_ENABLE)) {
+                return false;
+            }
+        }
         ///@}
         if (DBG) {
             Slog.d(TAG,"enable():  mBluetooth =" + mBluetooth +
@@ -834,6 +846,24 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
         if (DBG) Slog.d(TAG, "enable returning");
         return true;
     }
+       
+    /// M: Permission check for CTA requirement
+    private boolean startConsentUiIfNeeded(String packageName,
+        int callingUid, String intentAction) {
+        Intent intent = new Intent(intentAction);
+        intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName);
+               Slog.e(TAG, "menghua packageName:" + packageName);
+        intent.setFlags(
+            Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+            try {
+                mContext.startActivity(intent);
+            } catch (ActivityNotFoundException e) {
+                // Shouldn‘t happen
+                Slog.e(TAG, "Intent to handle action " + intentAction + " missing");
+                return false;
+            }
+            return true;
+    }
 
     public boolean disable(boolean persist) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
(END)
+++ b/packages/apps/Settings/src/com/android/settings/bluetooth/RequestPermissionActivity.java
@@ -75,6 +75,8 @@ public class RequestPermissionActivity extends Activity implements
     private boolean mUserConfirmed;
 
     private AlertDialog mDialog;

+ private String pkgName;//mh.add private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @@ -132,6 +134,7 @@ public class RequestPermissionActivity extends Activity implements intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); if (mEnableOnly) { intent.setAction(RequestPermissionHelperActivity.ACTION_INTERNAL_REQUEST_BT_ON); + intent.putExtra(Intent.EXTRA_PACKAGE_NAME, pkgName);//mh.add } else { intent.setAction(RequestPermissionHelperActivity. ACTION_INTERNAL_REQUEST_BT_ON_AND_DISCOVERABLE); @@ -266,6 +269,8 @@ public class RequestPermissionActivity extends Activity implements private boolean parseIntent() { Intent intent = getIntent(); if (intent != null && intent.getAction().equals(BluetoothAdapter.ACTION_REQUEST_ENABLE)) { + pkgName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);//mh.add + Log.i(TAG,"menghua pkgName:"+pkgName); mEnableOnly = true; } else if (intent != null && intent.getAction().equals(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE)) {
+++ b/packages/apps/Settings/src/com/android/settings/bluetooth/RequestPermissionHelperActivity.java
@@ -27,7 +27,11 @@ import com.android.internal.app.AlertController;
 import com.android.settings.R;
 import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
-
+//mh.add
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.text.TextUtils;
+//mh.end

     private boolean mEnableOnly;

+    private CharSequence appName;//mh.add
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -73,7 +79,12 @@ public class RequestPermissionHelperActivity extends AlertActivity implements
         final AlertController.AlertParams p = mAlertParams;
 
         if (mEnableOnly) {
-            p.mMessage = getString(R.string.bluetooth_ask_enablement);
+            if(appName == null){
+                p.mMessage = getString(R.string.bluetooth_ask_enablement);//mh.modify
+            }else {
+                p.mMessage = appName + getString(R.string.bluetooth_ask_enablement_joya);//mh.modify
+            }               
         } else {
             if (mTimeout == BluetoothDiscoverableEnabler.DISCOVERABLE_TIMEOUT_NEVER) {
                 p.mMessage = getString(R.string.bluetooth_ask_enablement_and_lasting_discovery);
@@ -133,6 +144,23 @@ public class RequestPermissionHelperActivity extends AlertActivity implements
     private boolean parseIntent() {
         Intent intent = getIntent();
         if (intent != null && intent.getAction().equals(ACTION_INTERNAL_REQUEST_BT_ON)) {
+            //mh.add @{
+            String pkgName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+                       
+            if(pkgName != null){
+                try {
+                    ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(pkgName, 0);
+                    appName = applicationInfo.loadSafeLabel(getPackageManager());
+                } catch (PackageManager.NameNotFoundException e) {
+                    Log.e(TAG, "Couldn‘t find app with package name " + pkgName);
+                    finish();
+                    return false;
+               }
+         }
+                       
+         Log.i(TAG,"menghua appName:"+appName);
+        //mh.end @}
             mEnableOnly = true;
         } else if (intent != null
                 && intent.getAction().equals(ACTION_INTERNAL_REQUEST_BT_ON_AND_DISCOVERABLE)) {
+++ b/packages/apps/Settings/res/values/strings.xml
@@ -268,6 +268,9 @@
 
     <!-- This string asks the user whether or not to allow an app to enable bluetooth. [CHAR LIMIT=100] -->
     <string name="bluetooth_ask_enablement">An app wants to turn Bluetooth ON for this device.</string>
+       
+       <!-- mh -->
+       <string name="bluetooth_ask_enablement_joya">wants to turn Bluetooth ON for this device.</string>

 

                                          Come on, China! Come on, Wuhan!

Android 7.0 CTA认证蓝牙权限未明示的问题

标签:info   style   proc   not   oca   set   lob   enc   new   

原文地址:https://www.cnblogs.com/copyworker/p/12378301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!