- 問題分析:
每次插入usb攝像頭時,都會彈出兩個提示框:
要允許xxx應用訪問xxx設備嗎?
要打開xxx應用來處理xxx設備嗎酷宵?
根據(jù)系統(tǒng)UI提示信息判斷是哪個源碼文件的問題
#進入提示頁面查看是哪兩個提示框
cd /home/yihao/alps-release-p0.mp1-V5/frameworks/base/packages/SystemUI/res/values-zh-rCN/
最后找到是UsbPermissionActivity.java和UsbConfirmActivity.java文件躬窜,使用命令:
jgrep UsbPermissionActivity
稍等幾分鐘,搜索結果:(注意XY6765開發(fā)板需要改vendor目錄下的源碼)
yihao@yihao-PowerEdge-R720:~/alps-release-p0.mp1-V5$ jgrep UsbPermissionActivity
./frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java:55:public class UsbPermissionActivity extends AlertActivity
./frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java:58: private static final String TAG = "UsbPermissionActivity";
./frameworks/base/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java:220: "com.android.systemui.usb.UsbPermissionActivity");
./frameworks/base/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java:228: Slog.e(TAG, "unable to start UsbPermissionActivity");
./frameworks/base/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java:261: // start UsbPermissionActivity so user can choose an activity
./vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java:55:public class UsbPermissionActivity extends AlertActivity
./vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java:58: private static final String TAG = "UsbPermissionActivity";
更改UsbPermissionActivity.java代碼:
#按包名放行
if(!mPackageName.contains("usbcameratest8")&&!mPackageName.contains("excelsior")){
setupAlert();
} else{
mPermissionGranted=true;
finish();
}
#或者如下男韧,全部放行
//setupAlert();//不使用窗口
mPermissionGranted = true;
finish();
更改UsbConfirmActivity.java代碼:
@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);
mResolveInfo = (ResolveInfo) intent.getParcelableExtra("rinfo");
PackageManager packageManager = getPackageManager();
String appName = mResolveInfo.loadLabel(packageManager).toString();
final AlertController.AlertParams ap = mAlertParams;
ap.mTitle = appName;
if (mDevice == null) {
ap.mMessage = getString(R.string.usb_accessory_confirm_prompt, appName,
mAccessory.getDescription());
mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);
} else {
ap.mMessage = getString(R.string.usb_device_confirm_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;
// 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(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);
/****@zxw 更改部分開始此虑,屏蔽確認層******/
// setupAlert();
try {
IBinder b = ServiceManager.getService(USB_SERVICE);
IUsbManager service = IUsbManager.Stub.asInterface(b);
final int uid = mResolveInfo.activityInfo.applicationInfo.uid;
final int userId = UserHandle.myUserId();
// boolean alwaysUse = mAlwaysUse.isChecked();
boolean alwaysUse = true; //默認一直使用
// Intent intent = null;
if (mDevice != null) {
// intent = new Intent(UsbManager.ACTION_USB_DEVICE_ATTACHED);
// intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice);
// grant permission for the device
service.grantDevicePermission(mDevice, uid);
// set or clear default setting
if (alwaysUse) {
service.setDevicePackage(
mDevice, mResolveInfo.activityInfo.packageName, userId);
} else {
service.setDevicePackage(mDevice, null, userId);
}
} else if (mAccessory != null) {
// intent = new Intent(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
// intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory);
// grant permission for the accessory
service.grantAccessoryPermission(mAccessory, uid);
// set or clear default setting
if (alwaysUse) {
service.setAccessoryPackage(
mAccessory, mResolveInfo.activityInfo.packageName, userId);
} else {
service.setAccessoryPackage(mAccessory, null, userId);
}
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(
new ComponentName(mResolveInfo.activityInfo.packageName,
mResolveInfo.activityInfo.name));
startActivityAsUser(intent, new UserHandle(userId));
} catch (Exception e) {
Log.e(TAG, "Unable to start activity", e);
}
finish();
/****@zxw 更改部分結束,屏蔽確認層******/
}
執(zhí)行編譯命令
make -j24 2>&1 | tee build.log
更改完代碼后鹃操,執(zhí)行刷機命令:
$adb reboot bootloader
$fastboot flash system system.img #燒寫system鏡像到system分區(qū)
#燒寫全部內容
$ fastboot flashall -w //這個 -w 是為了wipes the /data partition擦除/data分區(qū)
$fastboot reboot
附錄
中間修改代碼后有報錯,可以通過該提示找到編譯后的jar包位置
[ 30% 32/104] Target Java: out/target/common/obj/APPS/MtkSystemUI_intermediates/classes-full-debug.jar