UploadHandler.java revision 51f6a2f1dc524b31476fb71de36f2bd79f499d08
18233facddcc51865d612a919d450db6954aa48e3Michael Kolb/* 28233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Copyright (C) 2010 The Android Open Source Project 38233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 48233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58233facddcc51865d612a919d450db6954aa48e3Michael Kolb * you may not use this file except in compliance with the License. 68233facddcc51865d612a919d450db6954aa48e3Michael Kolb * You may obtain a copy of the License at 78233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 88233facddcc51865d612a919d450db6954aa48e3Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 108233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Unless required by applicable law or agreed to in writing, software 118233facddcc51865d612a919d450db6954aa48e3Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128233facddcc51865d612a919d450db6954aa48e3Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138233facddcc51865d612a919d450db6954aa48e3Michael Kolb * See the License for the specific language governing permissions and 148233facddcc51865d612a919d450db6954aa48e3Michael Kolb * limitations under the License. 158233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 168233facddcc51865d612a919d450db6954aa48e3Michael Kolb 178233facddcc51865d612a919d450db6954aa48e3Michael Kolbpackage com.android.browser; 188233facddcc51865d612a919d450db6954aa48e3Michael Kolb 198233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.app.Activity; 20e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdochimport android.content.ActivityNotFoundException; 218233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.content.Intent; 228233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.net.Uri; 238233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.os.Environment; 248233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.provider.MediaStore; 258233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.webkit.ValueCallback; 26e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdochimport android.widget.Toast; 278233facddcc51865d612a919d450db6954aa48e3Michael Kolb 288233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport java.io.File; 298233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport java.util.Vector; 308233facddcc51865d612a919d450db6954aa48e3Michael Kolb 318233facddcc51865d612a919d450db6954aa48e3Michael Kolb/** 328233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Handle the file upload callbacks from WebView here 338233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 348233facddcc51865d612a919d450db6954aa48e3Michael Kolbpublic class UploadHandler { 358233facddcc51865d612a919d450db6954aa48e3Michael Kolb 368233facddcc51865d612a919d450db6954aa48e3Michael Kolb /* 378233facddcc51865d612a919d450db6954aa48e3Michael Kolb * The Object used to inform the WebView of the file to upload. 388233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 398233facddcc51865d612a919d450db6954aa48e3Michael Kolb private ValueCallback<Uri> mUploadMessage; 408233facddcc51865d612a919d450db6954aa48e3Michael Kolb private String mCameraFilePath; 418233facddcc51865d612a919d450db6954aa48e3Michael Kolb 4251f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch private boolean mHandled; 4351f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch private boolean mCaughtActivityNotFoundException; 4451f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch 458233facddcc51865d612a919d450db6954aa48e3Michael Kolb private Controller mController; 468233facddcc51865d612a919d450db6954aa48e3Michael Kolb 478233facddcc51865d612a919d450db6954aa48e3Michael Kolb public UploadHandler(Controller controller) { 488233facddcc51865d612a919d450db6954aa48e3Michael Kolb mController = controller; 498233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 508233facddcc51865d612a919d450db6954aa48e3Michael Kolb 518233facddcc51865d612a919d450db6954aa48e3Michael Kolb String getFilePath() { 528233facddcc51865d612a919d450db6954aa48e3Michael Kolb return mCameraFilePath; 538233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 548233facddcc51865d612a919d450db6954aa48e3Michael Kolb 5551f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch boolean handled() { 5651f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch return mHandled; 5751f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch } 5851f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch 598233facddcc51865d612a919d450db6954aa48e3Michael Kolb void onResult(int resultCode, Intent intent) { 6051f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch 6151f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch if (resultCode == Activity.RESULT_CANCELED && mCaughtActivityNotFoundException) { 6251f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch // Couldn't resolve an activity, we are going to try again so skip 6351f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch // this result. 6451f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch mCaughtActivityNotFoundException = false; 6551f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch return; 6651f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch } 6751f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch 688233facddcc51865d612a919d450db6954aa48e3Michael Kolb Uri result = intent == null || resultCode != Activity.RESULT_OK ? null 698233facddcc51865d612a919d450db6954aa48e3Michael Kolb : intent.getData(); 708233facddcc51865d612a919d450db6954aa48e3Michael Kolb 718233facddcc51865d612a919d450db6954aa48e3Michael Kolb // As we ask the camera to save the result of the user taking 728233facddcc51865d612a919d450db6954aa48e3Michael Kolb // a picture, the camera application does not return anything other 738233facddcc51865d612a919d450db6954aa48e3Michael Kolb // than RESULT_OK. So we need to check whether the file we expected 748233facddcc51865d612a919d450db6954aa48e3Michael Kolb // was written to disk in the in the case that we 758233facddcc51865d612a919d450db6954aa48e3Michael Kolb // did not get an intent returned but did get a RESULT_OK. If it was, 768233facddcc51865d612a919d450db6954aa48e3Michael Kolb // we assume that this result has came back from the camera. 778233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (result == null && intent == null && resultCode == Activity.RESULT_OK) { 788233facddcc51865d612a919d450db6954aa48e3Michael Kolb File cameraFile = new File(mCameraFilePath); 798233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (cameraFile.exists()) { 808233facddcc51865d612a919d450db6954aa48e3Michael Kolb result = Uri.fromFile(cameraFile); 818233facddcc51865d612a919d450db6954aa48e3Michael Kolb // Broadcast to the media scanner that we have a new photo 828233facddcc51865d612a919d450db6954aa48e3Michael Kolb // so it will be added into the gallery for the user. 838233facddcc51865d612a919d450db6954aa48e3Michael Kolb mController.getActivity().sendBroadcast( 848233facddcc51865d612a919d450db6954aa48e3Michael Kolb new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, result)); 858233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 868233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 878233facddcc51865d612a919d450db6954aa48e3Michael Kolb 888233facddcc51865d612a919d450db6954aa48e3Michael Kolb mUploadMessage.onReceiveValue(result); 8951f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch mHandled = true; 9051f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch mCaughtActivityNotFoundException = false; 918233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 928233facddcc51865d612a919d450db6954aa48e3Michael Kolb 938233facddcc51865d612a919d450db6954aa48e3Michael Kolb void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { 948233facddcc51865d612a919d450db6954aa48e3Michael Kolb 958233facddcc51865d612a919d450db6954aa48e3Michael Kolb final String imageMimeType = "image/*"; 968233facddcc51865d612a919d450db6954aa48e3Michael Kolb final String videoMimeType = "video/*"; 978233facddcc51865d612a919d450db6954aa48e3Michael Kolb final String audioMimeType = "audio/*"; 988233facddcc51865d612a919d450db6954aa48e3Michael Kolb final String mediaSourceKey = "capture"; 998233facddcc51865d612a919d450db6954aa48e3Michael Kolb final String mediaSourceValueCamera = "camera"; 1008233facddcc51865d612a919d450db6954aa48e3Michael Kolb final String mediaSourceValueFileSystem = "filesystem"; 1018233facddcc51865d612a919d450db6954aa48e3Michael Kolb final String mediaSourceValueCamcorder = "camcorder"; 1028233facddcc51865d612a919d450db6954aa48e3Michael Kolb final String mediaSourceValueMicrophone = "microphone"; 1038233facddcc51865d612a919d450db6954aa48e3Michael Kolb 104e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // According to the spec, media source can be 'filesystem' or 'camera' or 'camcorder' 105e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // or 'microphone'. 1068233facddcc51865d612a919d450db6954aa48e3Michael Kolb String mediaSource = ""; 1078233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1088233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mUploadMessage != null) { 1098233facddcc51865d612a919d450db6954aa48e3Michael Kolb // Already a file picker operation in progress. 1108233facddcc51865d612a919d450db6954aa48e3Michael Kolb return; 1118233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1128233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1138233facddcc51865d612a919d450db6954aa48e3Michael Kolb mUploadMessage = uploadMsg; 1148233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1158233facddcc51865d612a919d450db6954aa48e3Michael Kolb // Parse the accept type. 1168233facddcc51865d612a919d450db6954aa48e3Michael Kolb String params[] = acceptType.split(";"); 1178233facddcc51865d612a919d450db6954aa48e3Michael Kolb String mimeType = params[0]; 1188233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1198233facddcc51865d612a919d450db6954aa48e3Michael Kolb for (String p : params) { 1208233facddcc51865d612a919d450db6954aa48e3Michael Kolb String[] keyValue = p.split("="); 1218233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (keyValue.length == 2) { 1228233facddcc51865d612a919d450db6954aa48e3Michael Kolb // Process key=value parameters. 1238233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mediaSourceKey.equals(keyValue[0])) { 1248233facddcc51865d612a919d450db6954aa48e3Michael Kolb mediaSource = keyValue[1]; 1258233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1268233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1278233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1288233facddcc51865d612a919d450db6954aa48e3Michael Kolb 129e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch //Ensure it is not still set from a previous upload. 130e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch mCameraFilePath = null; 1318233facddcc51865d612a919d450db6954aa48e3Michael Kolb 1328233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mimeType.equals(imageMimeType)) { 1338233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mediaSource.equals(mediaSourceValueCamera)) { 134e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // Specified 'image/*' and requested the camera, so go ahead and launch the 135e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // camera directly. 136e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(createCameraIntent()); 1378233facddcc51865d612a919d450db6954aa48e3Michael Kolb return; 1388233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else if (mediaSource.equals(mediaSourceValueFileSystem)) { 139e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // Specified 'image/*' and requested the filesystem, so go ahead and launch an 140e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // OPENABLE intent. 141e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(createOpenableIntent(imageMimeType)); 142e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return; 143e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } else { 144e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // Specified just 'image/*', so launch an intent for both the Camera and image/* 145e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // OPENABLE. 146e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Intent chooser = createChooserIntent(createCameraIntent()); 147e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(imageMimeType)); 148e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(chooser); 149e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return; 1508233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1518233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else if (mimeType.equals(videoMimeType)) { 1528233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mediaSource.equals(mediaSourceValueCamcorder)) { 1538233facddcc51865d612a919d450db6954aa48e3Michael Kolb // Specified 'video/*' and requested the camcorder, so go ahead and launch the 1548233facddcc51865d612a919d450db6954aa48e3Michael Kolb // camcorder directly. 155e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(createCamcorderIntent()); 1568233facddcc51865d612a919d450db6954aa48e3Michael Kolb return; 1578233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else if (mediaSource.equals(mediaSourceValueFileSystem)) { 158e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // Specified 'video/*' and requested the filesystem, so go ahead and launch an 159e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // an OPENABLE intent. 160e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(createOpenableIntent(videoMimeType)); 161e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return; 162e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } else { 163e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // Specified just 'video/*', so go ahead and launch an intent for both camcorder and 164e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // video/* OPENABLE. 165e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Intent chooser = createChooserIntent(createCamcorderIntent()); 166e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(videoMimeType)); 167e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(chooser); 168e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return; 1698233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1708233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else if (mimeType.equals(audioMimeType)) { 1718233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mediaSource.equals(mediaSourceValueMicrophone)) { 1728233facddcc51865d612a919d450db6954aa48e3Michael Kolb // Specified 'audio/*' and requested microphone, so go ahead and launch the sound 1738233facddcc51865d612a919d450db6954aa48e3Michael Kolb // recorder. 174e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(createSoundRecorderIntent()); 175e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return; 176e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } else if (mediaSource.equals(mediaSourceValueFileSystem)) { 177e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // Specified 'audio/*' and requested filesystem, so go ahead and launch an 178e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // OPENABLE intent. 179e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(createOpenableIntent(audioMimeType)); 180e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return; 181e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } else { 182e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // Specified just 'audio/*', so go ahead and launch an intent for both the sound 183e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // recorder and audio/* OPENABLE. 184e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Intent chooser = createChooserIntent(createSoundRecorderIntent()); 185e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch chooser.putExtra(Intent.EXTRA_INTENT, createOpenableIntent(audioMimeType)); 186e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(chooser); 1878233facddcc51865d612a919d450db6954aa48e3Michael Kolb return; 1888233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1898233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1908233facddcc51865d612a919d450db6954aa48e3Michael Kolb 191e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // No special handling based on the accept type was necessary, so trigger the default 192e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // file upload chooser. 193e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch startActivity(createDefaultOpenableIntent()); 194e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } 1958233facddcc51865d612a919d450db6954aa48e3Michael Kolb 196e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch private void startActivity(Intent intent) { 197e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch try { 198e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch mController.getActivity().startActivityForResult(intent, Controller.FILE_SELECTED); 199e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } catch (ActivityNotFoundException e) { 200e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // No installed app was able to handle the intent that 201e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // we sent, so fallback to the default file upload control. 202e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch try { 20351f6a2f1dc524b31476fb71de36f2bd79f499d08Ben Murdoch mCaughtActivityNotFoundException = true; 204e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch mController.getActivity().startActivityForResult(createDefaultOpenableIntent(), 205e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Controller.FILE_SELECTED); 206e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } catch (ActivityNotFoundException e2) { 207e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // Nothing can return us a file, so file upload is effectively disabled. 208e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Toast.makeText(mController.getActivity(), R.string.uploads_disabled, 209e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Toast.LENGTH_LONG).show(); 210e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } 2118233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 212e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } 2138233facddcc51865d612a919d450db6954aa48e3Michael Kolb 214e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch private Intent createDefaultOpenableIntent() { 215e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // Create and return a chooser with the default OPENABLE 216e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // actions including the camera, camcorder and sound 217e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch // recorder where available. 218e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Intent i = new Intent(Intent.ACTION_GET_CONTENT); 219e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch i.addCategory(Intent.CATEGORY_OPENABLE); 220e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch i.setType("*/*"); 2218233facddcc51865d612a919d450db6954aa48e3Michael Kolb 222e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Intent chooser = createChooserIntent(createCameraIntent(), createCamcorderIntent(), 223e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch createSoundRecorderIntent()); 224e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch chooser.putExtra(Intent.EXTRA_INTENT, i); 225e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return chooser; 226e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } 2278233facddcc51865d612a919d450db6954aa48e3Michael Kolb 228e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch private Intent createChooserIntent(Intent... intents) { 229e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Intent chooser = new Intent(Intent.ACTION_CHOOSER); 230e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents); 2318233facddcc51865d612a919d450db6954aa48e3Michael Kolb chooser.putExtra(Intent.EXTRA_TITLE, 2328233facddcc51865d612a919d450db6954aa48e3Michael Kolb mController.getActivity().getResources() 2338233facddcc51865d612a919d450db6954aa48e3Michael Kolb .getString(R.string.choose_upload)); 234e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return chooser; 2358233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2368233facddcc51865d612a919d450db6954aa48e3Michael Kolb 237e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch private Intent createOpenableIntent(String type) { 238e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Intent i = new Intent(Intent.ACTION_GET_CONTENT); 239e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch i.addCategory(Intent.CATEGORY_OPENABLE); 240e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch i.setType(type); 241e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return i; 242e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } 243e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch 244e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch private Intent createCameraIntent() { 245e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 246e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch File externalDataDir = Environment.getExternalStoragePublicDirectory( 247e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch Environment.DIRECTORY_DCIM); 248e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch File cameraDataDir = new File(externalDataDir.getAbsolutePath() + 249e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch File.separator + "browser-photos"); 250e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch cameraDataDir.mkdirs(); 251e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator + 252e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch System.currentTimeMillis() + ".jpg"; 253e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath))); 254e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return cameraIntent; 255e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } 256e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch 257e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch private Intent createCamcorderIntent() { 258e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 259e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch } 260e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch 261e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch private Intent createSoundRecorderIntent() { 262e4c0cae39f1ca34891de0f892aee4797c892caecBen Murdoch return new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 2638233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 2648233facddcc51865d612a919d450db6954aa48e3Michael Kolb 2658233facddcc51865d612a919d450db6954aa48e3Michael Kolb} 266