android系统USB设备静默获得权限

背景:在调试一个USB设备的时候,本来已经调通了,但是遇到一个问题,就是每次使用该USB设备的时候总是弹出一个对话框说要获取USB的权限,很烦人,故想方设法去调这个对话框。

总结了一些,USB设备静默获得权限的条件,有两个

  1. root
  2. 系统app
    注意:root手机有风险,需查看各种手机的root攻略;使用“幸运破解器”可以将app安装为系统app,或者将apk复制到/system/app/然后重启手机。

判断是否为系统app

public class PermissionUtil {
    public static boolean isSystemApp(Context context) {
        return (context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) > 0;
    }
}

下面模拟系统对获取USB权限对话框的“允许”按钮的动作,绕开对话框,然后手动伪造一条广播发出来。

if (PermissionUtil.isSystemApp(mContext)) { // 如果是系统应用就执行尝试默默做usb权限
    Intent intent = new Intent();
    intent.setAction(ACTION_USB_PERMISSION);
    intent.putExtra(UsbManager.EXTRA_DEVICE, device);
    intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true);

    final PackageManager pm = mContext.getPackageManager();
    try {
        ApplicationInfo aInfo = pm.getApplicationInfo(mContext.getPackageName(),
                0);
        try {
            IBinder b = ServiceManager.getService(USB_SERVICE);
            IUsbManager service = IUsbManager.Stub.asInterface(b);
            service.grantDevicePermission(device, aInfo.uid);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (PackageManager.NameNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    mContext.sendBroadcast(intent);
}

注意:由于android.hardware.usb.IUsbManager和android.os.ServiceManager是系统层面的代码,本来程序需要在android系统源码里编译,但这样直接复制这两个类的源码集成进项目工程里也可以实现。