Grant USB device permission by using system permission.
Previously it skips the device permission check by referring package name. The CL removes the special case and use general MANAGE_USB system-only permission to skip USB device permission dialog. BUG=26048722 Change-Id: I3702393a50696209499d1e5f6549dab9fb2cefe4
This commit is contained in:
@@ -23,6 +23,7 @@ import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.os.Process;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Log;
|
||||
|
||||
@@ -454,6 +455,21 @@ public class UsbManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Grants permission for USB device without showing system dialog.
|
||||
* Only system components can call this function.
|
||||
* @param device to request permissions for
|
||||
*
|
||||
* {@hide}
|
||||
*/
|
||||
public void grantPermission(UsbDevice device) {
|
||||
try {
|
||||
mService.grantDevicePermission(device, Process.myUid());
|
||||
} catch (RemoteException e) {
|
||||
Log.e(TAG, "RemoteException in grantPermission", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the specified USB function is currently enabled when in device mode.
|
||||
* <p>
|
||||
|
||||
@@ -5,6 +5,7 @@ LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_SRC_FILES := $(call all-java-files-under, src)
|
||||
LOCAL_PACKAGE_NAME := MtpDocumentsProvider
|
||||
LOCAL_CERTIFICATE := media
|
||||
LOCAL_PRIVILEGED_MODULE := true
|
||||
|
||||
include $(BUILD_PACKAGE)
|
||||
include $(LOCAL_PATH)/tests/Android.mk
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
package="com.android.mtp"
|
||||
android:sharedUserId="android.media">
|
||||
<uses-feature android:name="android.hardware.usb.host" />
|
||||
<uses-permission android:name="android.permission.MANAGE_USB" />
|
||||
<application android:label="@string/app_label">
|
||||
<provider
|
||||
android:name=".MtpDocumentsProvider"
|
||||
|
||||
@@ -26,14 +26,12 @@ import android.mtp.MtpEvent;
|
||||
import android.mtp.MtpObjectInfo;
|
||||
import android.os.CancellationSignal;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.os.Process;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* The model wrapping android.mtp API.
|
||||
@@ -63,8 +61,10 @@ class MtpManager {
|
||||
}
|
||||
|
||||
if (!mManager.hasPermission(rawDevice)) {
|
||||
// Permission should be obtained via app selection dialog for intent.
|
||||
throw new IOException("No permission to operate USB device.");
|
||||
mManager.grantPermission(rawDevice);
|
||||
if (!mManager.hasPermission(rawDevice)) {
|
||||
throw new IOException("Failed to grant a device permission.");
|
||||
}
|
||||
}
|
||||
|
||||
final MtpDevice device = new MtpDevice(rawDevice);
|
||||
|
||||
@@ -52,12 +52,10 @@ import org.xmlpull.v1.XmlPullParserException;
|
||||
import org.xmlpull.v1.XmlSerializer;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@@ -984,14 +982,7 @@ class UsbSettingsManager {
|
||||
public boolean hasPermission(UsbDevice device) {
|
||||
synchronized (mLock) {
|
||||
int uid = Binder.getCallingUid();
|
||||
int androidMediaUid;
|
||||
try {
|
||||
androidMediaUid = mPackageManager.getApplicationInfo("com.android.mtp", 0).uid;
|
||||
} catch (NameNotFoundException e) {
|
||||
androidMediaUid = -1;
|
||||
}
|
||||
if (uid == Process.SYSTEM_UID || UserHandle.getAppId(uid) == androidMediaUid ||
|
||||
mDisablePermissionDialogs) {
|
||||
if (uid == Process.SYSTEM_UID || mDisablePermissionDialogs) {
|
||||
return true;
|
||||
}
|
||||
SparseBooleanArray uidList = mDevicePermissionMap.get(device.getDeviceName());
|
||||
|
||||
Reference in New Issue
Block a user