Android usb设备权限查询及自动获取的示例分析
这篇文章主要介绍Android usb设备权限查询及自动获取的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
看到当上面的对话框弹出时,可以使用命令查看顶层的活动窗口
adb shell dumpsys window | findstr mCurrentFocusmCurrentFocus=Window{41ab0ee0 u0 com.android.systemui/com.android.systemui.usb.UsbPermissionActivity}
这就是应用的位置,当然我们也可以是用grep命令来查找这个对话框的.xml文件,进入android源码然后输入命令:
grep '默认情况下用于' ./ -Rn./SystemUI/res/values-zh-rCN/strings.xml:51: <string name="always_use_device" msgid="1450287437017315906">"默认情况下用于该 USB 设备"</string>./SystemUI/res/values-zh-rCN/strings.xml:52: <string name="always_use_accessory" msgid="1210954576979621596">"默认情况下用于该 USB 配件"</string>
那么这个对话框的路径在
/android/frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml
其相关的内容如下:
<string name="always_use_device" msgid="1450287437017315906">"默认情况下用于该 USB 设备"</string><string name="usb_device_permission_prompt" msgid="834698001271562057">"允许应用“<xliff:g id="APPLICATION">%1$s</xliff:g>”访问该 USB 设备吗?"
相关应用路径找到.java文件来修改,其位置在:
/android/frameworks/base/packages/SystemUI/class="lazy" data-src/com/android/systemui/usb/UsbPermissionActivity.java
这就是那个讨厌的对话框对应的java程序,那么来看看这个程序如下:
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); } }}
这段代码是获取应用的包名,我们可以通过包名对比来决定是否弹出对话框。
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);
在上面的代码就是对话框了,接下来就是要修该的东西了
setupAlert();
如果不需要显示对话框就可以这样修改,根据包名来判断该应用是否弹出
if(!mPackageName.equals("包名"))setupAlert();else {mPermissionGranted = true;finish();}
最终给该应用授权USB设备权限的代码,是通过调用grantDevicePermission()和grantAccessoryPermission()方法给该应用授权USB设备权限
@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
以上是“Android usb设备权限查询及自动获取的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341