2014-10-29 5 views
0

Может кто-нибудь сказать мне, почему этот код больше не сохраняет изображение в галерее? Я работал в какой-то момент, потом что-то изменил где-то еще, и теперь это не сработает.Камера не сохраняет изображение

private void openImageIntent() { 

    // Determine Uri of camera image to save. 
    final File storageDir = Environment 
      .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
    final String fname = ClassName.getUniqueImageFilename(); 
    final File sdImageMainDirectory = new File(storageDir, fname); 
    outputFileUri = Uri.fromFile(sdImageMainDirectory); 

    // Camera. 
    final List<Intent> cameraIntents = new ArrayList<Intent>(); 
    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, 
      "Chose a source"); 

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

    startActivityForResult(chooserIntent, REQUEST_IMAGE_CAPTURE); 
} 

private static String getUniqueImageFilename() { 
    // TODO Auto-generated method stub 
    String fileName = "img_" + System.currentTimeMillis() + ".jpg"; 
    return fileName; 
} 

Это ошибка, я получаю:

10-29 23:53:50.692: E/BitmapFactory(12547): Unable to decode stream: java.io.FileNotFoundException: /file:/storage/emulated/0/DCIM/img_1414623222659.jpg: open failed: ENOENT (No such file or directory) 
10-29 23:53:50.692: E/BitmapFactory(12547): Unable to decode stream: java.io.FileNotFoundException: /file:/storage/emulated/0/DCIM/img_1414623222659.jpg: open failed: ENOENT (No such file or directory) 

ответ

2
final File storageDir = Environment 
      .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 

Вы должны поставить разрешение в Android Manifest писать Внешние накопители

Android хранения сломана над другой версией Android SDK , Ваш код будет работать на некоторых устройствах, но не на всех.

Системе не удается создать файл в системе из-за отсутствия разрешения, поэтому он дает вам ошибку. Лучший способ, который я нашел, это просто увидеть, что если внешнее хранилище смонтировано, тогда создайте файл на внешнем.

Следующие два фрагмента кода и оба они будут работать.

Environment.getExternalStorageDirectory() + "/" + "myImages" + "/someimage.jpg"; 

После этого вы можете начать обновление медиа-магазина Intent для обновления Android Gallery.

или использовать этот код

final File dir = new File(context.getFilesDir() + "/nfs/guille/groce/users/nicholsk/workspace3/SQLTest"); 
dir.mkdirs(); //create folders where write files 
final File file = new File(dir, "BlockForTest.txt"); 
+0

Вы не указать, какие разрешения должны быть добавлены к манифесту ... – Confuse

+0

Если вы используете Android 4.4.4, то вам не нужно, так как Android будет дайте вам доступ без разрешения, но если вы запустите тот же код в какой-то более старой версии, вам необходимо определить разрешение. Поскольку он не упоминал, в какой версии он работает, поэтому лучше предложить добавить разрешение. –

+0

Это действительно работает, но мне нужно от 30 секунд до 2 минут, чтобы сделать фотографию, пока она не будет создана в галерее, вы знаете, почему это может быть? Потому что это немного дольше, чем вы должны ждать его правильно? Btw Я использую Galaxy S5 для тестирования. Поэтому я думаю, что это должно быть достаточно быстро. –

Смежные вопросы