summaryrefslogtreecommitdiff
path: root/packages/ExternalStorageProvider/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/ExternalStorageProvider/src')
-rw-r--r--packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java30
1 files changed, 26 insertions, 4 deletions
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 4a9c35615131..4abcf73af109 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -37,6 +37,7 @@ import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsContract.Path;
import android.provider.DocumentsContract.Root;
+import android.provider.MediaStore;
import android.provider.Settings;
import android.system.ErrnoException;
import android.system.Os;
@@ -145,6 +146,7 @@ public class ExternalStorageProvider extends FileSystemProvider {
}
}
+ @GuardedBy("mRootsLock")
private void updateVolumesLocked() {
mRoots.clear();
@@ -606,11 +608,16 @@ public class ExternalStorageProvider extends FileSystemProvider {
}
break;
}
- case "getDocumentId": {
- final String path = arg;
- final List<UriPermission> accessUriPermissions =
- extras.getParcelableArrayList(AUTHORITY + ".extra.uriPermissions");
+ case MediaStore.GET_DOCUMENT_URI_CALL: {
+ // All callers must go through MediaProvider
+ getContext().enforceCallingPermission(
+ android.Manifest.permission.WRITE_MEDIA_STORAGE, TAG);
+
+ final Uri fileUri = extras.getParcelable(DocumentsContract.EXTRA_URI);
+ final List<UriPermission> accessUriPermissions = extras
+ .getParcelableArrayList(DocumentsContract.EXTRA_URI_PERMISSIONS);
+ final String path = fileUri.getPath();
try {
final Bundle out = new Bundle();
final Uri uri = getDocumentUri(path, accessUriPermissions);
@@ -619,7 +626,22 @@ public class ExternalStorageProvider extends FileSystemProvider {
} catch (FileNotFoundException e) {
throw new IllegalStateException("File in " + path + " is not found.", e);
}
+ }
+ case MediaStore.GET_MEDIA_URI_CALL: {
+ // All callers must go through MediaProvider
+ getContext().enforceCallingPermission(
+ android.Manifest.permission.WRITE_MEDIA_STORAGE, TAG);
+ final Uri documentUri = extras.getParcelable(DocumentsContract.EXTRA_URI);
+ final String docId = DocumentsContract.getDocumentId(documentUri);
+ try {
+ final Bundle out = new Bundle();
+ final Uri uri = Uri.fromFile(getFileForDocId(docId));
+ out.putParcelable(DocumentsContract.EXTRA_URI, uri);
+ return out;
+ } catch (FileNotFoundException e) {
+ throw new IllegalStateException(e);
+ }
}
default:
Log.w(TAG, "unknown method passed to call(): " + method);