赞
踩
在进行Frameworks开发过程中遇到需要客户app 需要使用usb权限,在插入usb设备的时候会有一个弹窗提示是否允许客户应用使用usb设备,并且在每次插入usb设备的时候客户应用都会弹窗
/android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
通过查看文件中的oncreat方法可得知:通过setupAlert(); 设置对话框参数并显示对话框。最后解决办法一目了然。可以直接屏蔽此方法,然后再默认给于权限就可以了
public void onCreate(Bundle icicle) { super.onCreate(icicle); // 获取传入的意图 Intent intent = getIntent(); // 从意图中获取USB设备和USB附件对象 mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); // 从意图中获取待处理的Intent、UID和包名 mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT); mUid = intent.getIntExtra(Intent.EXTRA_UID, -1); mPackageName = intent.getStringExtra(UsbManager.EXTRA_PACKAGE); // 从包管理器中获取应用信息 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(); final AlertController.AlertParams ap = mAlertParams; ap.mTitle = appName; // 根据设备类型设置消息文本 if (mDevice == null) { ap.mMessage = getString(R.string.usb_accessory_permission_prompt, appName, mAccessory.getDescription()); mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); } else { ap.mMessage = getString(R.string.usb_device_permission_prompt, appName, mDevice.getProductName()); 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; // 如果应用可以成为默认处理程序并且存在USB设备或附件,则添加“打开时”复选框 if (canBeDefault && (mDevice != null || mAccessory != null)) { 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(getString(R.string.always_use_accessory, appName, mAccessory.getDescription())); } else { mAlwaysUse.setText(getString(R.string.always_use_device, appName, mDevice.getProductName())); } mAlwaysUse.setOnCheckedChangeListener(this); mClearDefaultHint = (TextView)ap.mView.findViewById( com.android.internal.R.id.clearDefaultHint); mClearDefaultHint.setVisibility(View.GONE); } // 设置对话框参数并显示对话框 setupAlert(); }
代码如下:
--- a/android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
+++ b/android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java
@@ -116,8 +116,11 @@ public class UsbPermissionActivity extends AlertActivity
com.android.internal.R.id.clearDefaultHint);
mClearDefaultHint.setVisibility(View.GONE);
}
-
- setupAlert();
+//add by ltj 解决应用使用usb设备权限查询相应问题并且自动获取usb权限
+ // setupAlert();
+ mPermissionGranted = true;
+ finish();
+ //add end by ltj
}
最终发现在usb设备插入之后应用不在弹出权限复选框。
可以通过弹出框字段,查询到此字段的id号,最终通过id查询到使用此字段的位置,最终找到调用权限复选框的位置,最终解决问题。
很多失败不是因为能力有限,而是因为没有坚持到底。凡事都需要给自己一个坚持到底的理由,就算最后的结果不如意,但是你依旧收获了这个过程!!
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。