android P MTK USB Camera权限问题(可以修改源码)

android P MTK USB Camera权限问题

近日客户需要内置一个usbCamera APK ,内置之后usb camera apk 后不能打开,打印log发现是Camera权限问题

源码路径:
frameworks/base/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java

/**
 * Check for camera permission of the calling process.
 *
 * @param packageName Package name of the caller.
 * @param uid Linux uid of the calling process.
 *
 * @return True in case camera permission is available, False otherwise.
 */
private boolean isCameraPermissionGranted(String packageName, int uid) {
    int targetSdkVersion = android.os.Build.VERSION_CODES.P;
    try {
        ApplicationInfo aInfo = mPackageManager.getApplicationInfo(packageName, 0);
        // compare uid with packageName to foil apps pretending to be someone else
        if (aInfo.uid != uid) {
            Slog.i(TAG, "Package " + packageName + " does not match caller's uid " + uid);
            return false;
        }
        targetSdkVersion = aInfo.targetSdkVersion;
    } catch (PackageManager.NameNotFoundException e) {
        Slog.i(TAG, "Package not found, likely due to invalid package name!");
        return false;
    }
	//这里可以清楚的看到sdk版本在android 9 以上需要camera的权限的
    if (targetSdkVersion >= android.os.Build.VERSION_CODES.P) {
        int allowed = mUserContext.checkCallingPermission(android.Manifest.permission.CAMERA);
        if (android.content.pm.PackageManager.PERMISSION_DENIED == allowed) {
        	//输出的全log的信息
            Slog.i(TAG, "Camera permission required for USB video class devices");
            return false;
        }
    }

    return true;
}

    public boolean hasPermission(UsbDevice device, String packageName, int uid) {
        if (isCameraDevicePresent(device)) {
            if (!isCameraPermissionGranted(packageName, uid)) {
                return false;
            }
        }
    return mUsbPermissionManager.hasPermission(device, uid);
}

因为客户的apk不容易修改,所以只能我这边强制修改

修改之后的:

public boolean hasPermission(UsbDevice device, String packageName, int uid) {
     //start
    //android.util.Log.i(TAG,"[hasPermission] packageName " + packageName);
    //这边需要过滤下你的usb camera apk 就可以了
    if(packageName.equals("com.xxx.xxx")){
        return true;
    }
    //end
    if (isCameraDevicePresent(device)) {
        if (!isCameraPermissionGranted(packageName, uid)) {
            return false;
        }
    }

    return mUsbPermissionManager.hasPermission(device, uid);
}

这也算是一种解决方案,但大家尽量不要这样修改,我这边是客户定制的,在开发usb camera
时,尽量sdk版本在27活27以下:

plugins {
    id 'com.android.application'
}
android {
    compileSdk 28

    defaultConfig {
        applicationId "com.xxx.xxxx"
        minSdk 24
        targetSdk 27
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}
dependencies {
	//这里使用1.1.0,不然会有很多报错问题
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation project(path: ':feature')
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值