Android usb設(shè)備權(quán)限查詢(xún)及自動(dòng)獲取詳解流程
看到當(dāng)上面的對(duì)話(huà)框彈出時(shí),可以使用命令查看頂層的活動(dòng)窗口
adb shell dumpsys window | findstr mCurrentFocus mCurrentFocus=Window{41ab0ee0 u0 com.android.systemui/com.android.systemui.usb.UsbPermissionActivity}
這就是應(yīng)用的位置,當(dāng)然我們也可以是用grep命令來(lái)查找這個(gè)對(duì)話(huà)框的.xml文件,進(jìn)入android源碼然后輸入命令:
grep '默認(rèn)情況下用于' ./ -Rn ./SystemUI/res/values-zh-rCN/strings.xml:51: <string name="always_use_device" msgid="1450287437017315906">"默認(rèn)情況下用于該 USB 設(shè)備"</string> ./SystemUI/res/values-zh-rCN/strings.xml:52: <string name="always_use_accessory" msgid="1210954576979621596">"默認(rèn)情況下用于該 USB 配件"</string>
那么這個(gè)對(duì)話(huà)框的路徑在
/android/frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml
其相關(guān)的內(nèi)容如下:
<string name="always_use_device" msgid="1450287437017315906">"默認(rèn)情況下用于該 USB 設(shè)備"</string> <string name="usb_device_permission_prompt" msgid="834698001271562057">"允許應(yīng)用“<xliff:g id="APPLICATION">%1$s</xliff:g>”訪(fǎng)問(wèn)該 USB 設(shè)備嗎?"
相關(guān)應(yīng)用路徑找到.java文件來(lái)修改,其位置在:
/android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
這就是那個(gè)討厭的對(duì)話(huà)框?qū)?yīng)的java程序,那么來(lái)看看這個(gè)程序如下:
/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.usb; import android.app.AlertDialog; import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.hardware.usb.IUsbManager; import android.hardware.usb.UsbAccessory; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.TextView; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; import com.android.systemui.R; public class UsbPermissionActivity extends AlertActivity implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { private static final String TAG = "UsbPermissionActivity"; private CheckBox mAlwaysUse; private TextView mClearDefaultHint; private UsbDevice mDevice; private UsbAccessory mAccessory; private PendingIntent mPendingIntent; private String mPackageName; private int mUid; private boolean mPermissionGranted; private UsbDisconnectedReceiver mDisconnectedReceiver; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); Intent intent = getIntent(); mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT); mUid = intent.getIntExtra(Intent.EXTRA_UID, -1); mPackageName = intent.getStringExtra("package"); Log.e(TAG, "mPackageName "+ mPackageName); Log.e(TAG, "mUid "+ mUid); PackageManager packageManager = getPackageManager(); ApplicationInfo aInfo; try { aInfo = packageManager.getApplicationInfo(mPackageName, 0); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, "unable to look up package name", e); finish(); return; } String appName = aInfo.loadLabel(packageManager).toString(); Log.e(TAG, "appName "+ appName); final AlertController.AlertParams ap = mAlertParams; ap.mIcon = aInfo.loadIcon(packageManager); ap.mTitle = appName; if (mDevice == null) { ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName); mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); } else { ap.mMessage = getString(R.string.usb_device_permission_prompt, appName); mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); } ap.mPositiveButtonText = getString(android.R.string.ok); ap.mNegativeButtonText = getString(android.R.string.cancel); ap.mPositiveButtonListener = this; ap.mNegativeButtonListener = this; // add "always use" checkbox LayoutInflater inflater = (LayoutInflater)getSystemService( Context.LAYOUT_INFLATER_SERVICE); ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); if (mDevice == null) { mAlwaysUse.setText(R.string.always_use_accessory); } else { mAlwaysUse.setText(R.string.always_use_device); } mAlwaysUse.setOnCheckedChangeListener(this); mClearDefaultHint = (TextView)ap.mView.findViewById( com.android.internal.R.id.clearDefaultHint); mClearDefaultHint.setVisibility(View.GONE); if(!mPackageName.equals("com.zqc.usbcamera")) setupAlert(); else { mPermissionGranted = true; finish(); } } @Override public void onDestroy() { IBinder b = ServiceManager.getService(USB_SERVICE); IUsbManager service = IUsbManager.Stub.asInterface(b); // send response via pending intent Intent intent = new Intent(); try { if (mDevice != null) { intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice); if (mPermissionGranted) { service.grantDevicePermission(mDevice, mUid); if (mAlwaysUse.isChecked()) { final int userId = UserHandle.getUserId(mUid); service.setDevicePackage(mDevice, mPackageName, userId); } } } if (mAccessory != null) { intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory); if (mPermissionGranted) { service.grantAccessoryPermission(mAccessory, mUid); if (mAlwaysUse.isChecked()) { final int userId = UserHandle.getUserId(mUid); service.setAccessoryPackage(mAccessory, mPackageName, userId); } } } intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, mPermissionGranted); mPendingIntent.send(this, 0, intent); } catch (PendingIntent.CanceledException e) { Log.w(TAG, "PendingIntent was cancelled"); } catch (RemoteException e) { Log.e(TAG, "IUsbService connection failed", e); } if (mDisconnectedReceiver != null) { unregisterReceiver(mDisconnectedReceiver); } super.onDestroy(); } public void onClick(DialogInterface dialog, int which) { if (which == AlertDialog.BUTTON_POSITIVE) { mPermissionGranted = true; } finish(); } public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (mClearDefaultHint == null) return; if(isChecked) { mClearDefaultHint.setVisibility(View.VISIBLE); } else { mClearDefaultHint.setVisibility(View.GONE); } } }
這段代碼是獲取應(yīng)用的包名,我們可以通過(guò)包名對(duì)比來(lái)決定是否彈出對(duì)話(huà)框。
final AlertController.AlertParams ap = mAlertParams; ap.mIcon = aInfo.loadIcon(packageManager); ap.mTitle = appName; if (mDevice == null) { ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName); mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); } else { ap.mMessage = getString(R.string.usb_device_permission_prompt, appName); mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); } ap.mPositiveButtonText = getString(android.R.string.ok); ap.mNegativeButtonText = getString(android.R.string.cancel); ap.mPositiveButtonListener = this; ap.mNegativeButtonListener = this; // add "always use" checkbox LayoutInflater inflater = (LayoutInflater)getSystemService( Context.LAYOUT_INFLATER_SERVICE); ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); if (mDevice == null) { mAlwaysUse.setText(R.string.always_use_accessory); } else { mAlwaysUse.setText(R.string.always_use_device); } mAlwaysUse.setOnCheckedChangeListener(this); mClearDefaultHint = (TextView)ap.mView.findViewById( com.android.internal.R.id.clearDefaultHint); mClearDefaultHint.setVisibility(View.GONE);
在上面的代碼就是對(duì)話(huà)框了,接下來(lái)就是要修該的東西了
setupAlert();
如果不需要顯示對(duì)話(huà)框就可以這樣修改,根據(jù)包名來(lái)判斷該應(yīng)用是否彈出
if(!mPackageName.equals("包名")) setupAlert(); else { mPermissionGranted = true; finish(); }
最終給該應(yīng)用授權(quán)USB設(shè)備權(quán)限的代碼,是通過(guò)調(diào)用grantDevicePermission()和grantAccessoryPermission()方法給該應(yīng)用授權(quán)USB設(shè)備權(quán)限
@Override public void onDestroy() { IBinder b = ServiceManager.getService(USB_SERVICE); IUsbManager service = IUsbManager.Stub.asInterface(b); // send response via pending intent Intent intent = new Intent(); try { if (mDevice != null) { intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice); if (mPermissionGranted) { service.grantDevicePermission(mDevice, mUid); if (mAlwaysUse.isChecked()) { final int userId = UserHandle.getUserId(mUid); service.setDevicePackage(mDevice, mPackageName, userId); } } } if (mAccessory != null) { intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory); if (mPermissionGranted) { service.grantAccessoryPermission(mAccessory, mUid); if (mAlwaysUse.isChecked()) { final int userId = UserHandle.getUserId(mUid); service.setAccessoryPackage(mAccessory, mPackageName, userId); } } } intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, mPermissionGranted); mPendingIntent.send(this, 0, intent); } catch (PendingIntent.CanceledException e) { Log.w(TAG, "PendingIntent was cancelled"); } catch (RemoteException e) { Log.e(TAG, "IUsbService connection failed", e); } if (mDisconnectedReceiver != null) { unregisterReceiver(mDisconnectedReceiver); } super.onDestroy(); }
日志打印
C:\Users\Android1>adb shell logcat -s UsbPermissionActivity
--------- beginning of /dev/log/system
--------- beginning of /dev/log/main
E/UsbPermissionActivity( 708): mPackageName com.test.usbcamera
E/UsbPermissionActivity( 708): mUid 10018
E/UsbPermissionActivity( 708): appName USBCamera
E/UsbPermissionActivity( 708): onDestroy() grantDevicePermission false
E/UsbPermissionActivity( 708): mPackageName com.zqc.usbcamera
E/UsbPermissionActivity( 708): mUid 10019
E/UsbPermissionActivity( 708): appName USBCamera
E/UsbPermissionActivity( 708): onDestroy() grantDevicePermission false
到此這篇關(guān)于A(yíng)ndroid usb設(shè)備權(quán)限查詢(xún)及自動(dòng)獲取詳解流程的文章就介紹到這了,更多相關(guān)Android usb設(shè)備權(quán)限 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android組件間通信--深入理解Intent與IntentFilter
本篇文章是對(duì)Android組件間通信Intent與IntentFilter進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05淺談Service Manager成為Android進(jìn)程間通信(IPC)機(jī)制Binder守護(hù)進(jìn)程之路
本文主要介紹 淺談Service Manager成為Android進(jìn)程間通信(IPC)機(jī)制Binder守護(hù)進(jìn)程之路,這里詳細(xì)介紹了相關(guān)Binder的資料,幫助大家理解學(xué)習(xí)Android 源碼Binder通信機(jī)制,有興趣的小伙伴可以參考下2016-08-08史上最全Android build.gradle配置詳解(小結(jié))
這篇文章主要介紹了史上最全Android build.gradle配置詳解(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04Android Socket接口實(shí)現(xiàn)即時(shí)通訊實(shí)例代碼
這篇文章主要介紹了Android Socket接口實(shí)現(xiàn)即時(shí)通訊實(shí)例代碼的相關(guān)資料,這里對(duì)通訊知識(shí)進(jìn)行了詳細(xì)介紹,并用Socket 接口實(shí)現(xiàn)通訊實(shí)例,需要的朋友可以參考下2016-12-12淺談Android開(kāi)發(fā)者2017年最值得關(guān)注的25個(gè)實(shí)用庫(kù)
本篇文章主要介紹了Android開(kāi)發(fā)者2017年最值得關(guān)注的25個(gè)庫(kù),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09Android webview加載https鏈接錯(cuò)誤或無(wú)響應(yīng)的解決
這篇文章主要介紹了Android webview加載https鏈接錯(cuò)誤或無(wú)響應(yīng)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android組件banner實(shí)現(xiàn)左右滑屏效果
這篇文章主要為大家詳細(xì)介紹了Android組件banner實(shí)現(xiàn)左右滑屏效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10Android?flutter?Dio鎖的巧妙實(shí)現(xiàn)方法示例
這篇文章主要為大家介紹了Android?flutter?Dio鎖的巧妙實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01