| Index: ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
|
| diff --git a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
|
| index 05186ebc77fc76b1e6f110d6777b1f1301508844..180b49334ec212d924bd1645c6ec7885242903db 100644
|
| --- a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
|
| +++ b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
|
| @@ -8,13 +8,14 @@ import android.annotation.TargetApi;
|
| import android.app.Activity;
|
| import android.content.ClipData;
|
| import android.content.ContentResolver;
|
| +import android.content.Context;
|
| import android.content.Intent;
|
| import android.net.Uri;
|
| import android.os.AsyncTask;
|
| import android.os.Build;
|
| -import android.os.Environment;
|
| import android.provider.MediaStore;
|
| import android.text.TextUtils;
|
| +import android.util.Log;
|
|
|
| import org.chromium.base.CalledByNative;
|
| import org.chromium.base.ContentUriUtils;
|
| @@ -22,6 +23,7 @@ import org.chromium.base.JNINamespace;
|
| import org.chromium.ui.R;
|
|
|
| import java.io.File;
|
| +import java.io.IOException;
|
| import java.util.ArrayList;
|
| import java.util.Arrays;
|
| import java.util.List;
|
| @@ -32,6 +34,7 @@ import java.util.List;
|
| */
|
| @JNINamespace("ui")
|
| class SelectFileDialog implements WindowAndroid.IntentCallback{
|
| + private static final String TAG = "SelectFileDialog";
|
| private static final String IMAGE_TYPE = "image/";
|
| private static final String VIDEO_TYPE = "video/";
|
| private static final String AUDIO_TYPE = "audio/";
|
| @@ -40,6 +43,8 @@ class SelectFileDialog implements WindowAndroid.IntentCallback{
|
| private static final String ALL_AUDIO_TYPES = AUDIO_TYPE + "*";
|
| private static final String ANY_TYPES = "*/*";
|
| private static final String CAPTURE_IMAGE_DIRECTORY = "browser-photos";
|
| + // Keep this variable in sync with the value defined in file_paths.xml.
|
| + private static final String IMAGE_FILE_PATH = "images";
|
|
|
| private final long mNativeSelectFileDialog;
|
| private List<String> mFileTypes;
|
| @@ -66,8 +71,23 @@ class SelectFileDialog implements WindowAndroid.IntentCallback{
|
|
|
| Intent chooser = new Intent(Intent.ACTION_CHOOSER);
|
| Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
| - mCameraOutputUri = Uri.fromFile(getFileForImageCapture());
|
| + camera.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
| + Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
| + Context context = window.getApplicationContext();
|
| + try {
|
| + mCameraOutputUri = ContentUriUtils.getContentUriFromFile(
|
| + context, getFileForImageCapture(context));
|
| + } catch (IOException e) {
|
| + Log.e(TAG, "Cannot retrieve content uri from file", e);
|
| + }
|
| + if (mCameraOutputUri == null) {
|
| + onFileNotSelected();
|
| + return;
|
| + }
|
| +
|
| camera.putExtra(MediaStore.EXTRA_OUTPUT, mCameraOutputUri);
|
| + camera.setClipData(
|
| + ClipData.newUri(context.getContentResolver(), IMAGE_FILE_PATH, mCameraOutputUri));
|
| Intent camcorder = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
|
| Intent soundRecorder = new Intent(
|
| MediaStore.Audio.Media.RECORD_SOUND_ACTION);
|
| @@ -125,18 +145,16 @@ class SelectFileDialog implements WindowAndroid.IntentCallback{
|
| }
|
|
|
| /**
|
| - * Get a file for the image capture in the CAPTURE_IMAGE_DIRECTORY directory.
|
| + * Get a file for the image capture in the IMAGE_FILE_PATH directory.
|
| + * @param context The application context.
|
| */
|
| - private File getFileForImageCapture() {
|
| - File externalDataDir = Environment.getExternalStoragePublicDirectory(
|
| - Environment.DIRECTORY_DCIM);
|
| - File cameraDataDir = new File(externalDataDir.getAbsolutePath() +
|
| - File.separator + CAPTURE_IMAGE_DIRECTORY);
|
| - if (!cameraDataDir.exists() && !cameraDataDir.mkdirs()) {
|
| - cameraDataDir = externalDataDir;
|
| + private File getFileForImageCapture(Context context) throws IOException {
|
| + final File path = new File(context.getFilesDir(), IMAGE_FILE_PATH);
|
| + if (!path.exists() && !path.mkdir()) {
|
| + throw new IOException("Folder cannot be created.");
|
| }
|
| - File photoFile = new File(cameraDataDir.getAbsolutePath() +
|
| - File.separator + System.currentTimeMillis() + ".jpg");
|
| + File photoFile = File.createTempFile(
|
| + String.valueOf(System.currentTimeMillis()), ".jpg", path);
|
| return photoFile;
|
| }
|
|
|
| @@ -160,7 +178,8 @@ class SelectFileDialog implements WindowAndroid.IntentCallback{
|
| if (results == null) {
|
| // If we have a successful return but no data, then assume this is the camera returning
|
| // the photo that we requested.
|
| - nativeOnFileSelected(mNativeSelectFileDialog, mCameraOutputUri.getPath(), "");
|
| + nativeOnFileSelected(mNativeSelectFileDialog, mCameraOutputUri.toString(),
|
| + mCameraOutputUri.getLastPathSegment());
|
|
|
| // Broadcast to the media scanner that there's a new photo on the device so it will
|
| // show up right away in the gallery (rather than waiting until the next time the media
|
|
|