2017-04-12 127 views
0

我試圖讓我的用戶從手機圖庫中選擇一張圖片或用相機拍照。 我寫了一篇關於我的三星S6如何避免在相機意圖上使用MediaStore.EXTRA_OUTPUT?

private void openPictureIntent() { 
     final List<Intent> cameraIntents = new ArrayList<>(); 
     final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     final PackageManager packageManager = getPackageManager(); 
     final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
     for (ResolveInfo res : listCam) { 
      final String packageName = res.activityInfo.packageName; 
      final Intent intent = new Intent(captureIntent); 
      intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
      intent.setPackage(packageName); 
      cameraIntents.add(intent); 
     } 

     // Filesystem. 
     final Intent galleryIntent = new Intent(); 
     galleryIntent.setType("image/*"); 
     galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 

     // Chooser of filesystem options. 
     final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 

     // Add the camera options. 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()])); 

     startActivityForResult(chooserIntent, SELECT_PICTURE_CODE); 
    } 

然後我嘗試了在Nexus 5X工作真的很好一段代碼和我的應用程序崩潰。我瞭解到,在某些設備上,onActivityResult中檢索到的意圖爲空。解決辦法是給uri保存用相機拍攝的圖像。我實施它,我的代碼變成

private void openPictureIntent() { 
     // Determine Uri of camera image to save. 
     final File dir = new File(Environment.getExternalStorageDirectory() + File.separator + "Directory" + File.separator); 
     dir.mkdirs(); 
     final String fname = UUID.randomUUID() + ".jpg"; 
     final File sdImageMainDirectory = new File(dir, fname); 
     outputFileUri = Uri.fromFile(sdImageMainDirectory); 
     new File(outputFileUri.getPath()).delete(); 

     // Camera. 
     final List<Intent> cameraIntents = new ArrayList<>(); 
     final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     final PackageManager packageManager = getPackageManager(); 
     final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
     for (ResolveInfo res : listCam) { 
      final String packageName = res.activityInfo.packageName; 
      final Intent intent = new Intent(captureIntent); 
      intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
      intent.setPackage(packageName); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
      cameraIntents.add(intent); 
     } 

     // Filesystem. 
     final Intent galleryIntent = new Intent(); 
     galleryIntent.setType("image/*"); 
     galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 

     // Chooser of filesystem options. 
     final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 

     // Add the camera options. 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()])); 

     startActivityForResult(chooserIntent, SELECT_PICTURE_CODE); 
    } 

這是行得通的,但我不滿意。我希望我的照片能夠與其他相機照片一起存儲,而不是放在特殊的目錄中。我怎麼能做到這一點?

+0

保存圖像Environment.DIRECTORY_PICTURES目錄 –

+0

該圖庫不會顯示圖片目錄中的照片(對於DCIM存儲庫也是如此),並且我希望在每個設備上都有相同的結果 – Tibo

+0

存儲在' Environment.DIRECTORY_PICTURES'和'Environment.DIRECTORY_DCIM'完全有資格被'MediaStore'掃描,因此顯示在圖庫類型的應用程序中。它們將最終自動編入索引,開發人員可以使用「MediaScannerConnection」在創建時將特定文件添加到「MediaStore」。 – CommonsWare

回答

1

我知道在某些設備上onActivityResult中檢索到的意圖爲空。

它應該是null所有相機應用程序。某些相機應用程序開發人員未能閱讀the documentation for ACTION_IMAGE_CAPTURE

,我想我的照片存儲與其他相機的照片,而不是在不被ACTION_IMAGE_CAPTURE支持一個特殊的目錄

+0

如果我理解你的答案,總之沒有解決方案,如果我想使用ACTION_IMAGE_CAPTURE? – Tibo

+0

@Tibo:有數千個相機應用程序,其中很多都支持「ACTION_IMAGE_CAPTURE」。您無法知道「與其他相機照片」在哪裏將用於數千個相機應用程序。您可以將照片存儲在一個可能的位置(例如'Environment.DIRECTORY_DCIM'),但就是這樣。 – CommonsWare

+0

感謝您的回答! – Tibo