Проблемы, сохраняющие фотографию в файл

Человек, я все еще не могу сохранить картинку, когда я отправляю намерение просить фотографию быть взятым. Вот то, что я делаю:

  1. Сделайте URI, представляющий путь

    android.content.Context c = getApplicationContext(); 
    
    String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg";
    
    java.io.File file = new java.io.File( fname ); 
    
    Uri fileUri = Uri.fromFile(file);
    
  2. Создайте Намерение (не забывайте имя pkg!) и запускают действие

    private static int TAKE_PICTURE = 22;
    
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE );
    
    intent.putExtra("com.droidstogo.boom1." + MediaStore.EXTRA_OUTPUT, fileUri);
    startActivityForResult( intent, TAKE_PICTURE );
    
  3. Действие камеры запускается, и я могу сделать снимок и утвердить его. Мой onActivityResult() затем назван. Но мой файл не становится записанным. URI: file:///data/data/com.droidstogo.boom1/files/parked.jpg

  4. Я могу создать миниатюру хорошо (не поместив дополнительное в Намерение) и могу записать, что файл хорошо, и позже считал его назад).

Кто-либо может видеть, какую простую ошибку я делаю? Ничто очевидные шоу в logcat - камера ясно не делает снимок.Спасибо,

Peter


Я должен упомянуть, что мне установили соответствующие полномочия в файле AndroidManifest.xml:

    <uses-permission android:name="android.permission.READ_OWNER_DATA" />
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />

    <uses-permission android:name="android.permission.CAMERA" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-library android:name="com.google.android.maps" />



</application>

Какие-либо идеи? Какие-либо идеи о вещах попробовать, получить больше информации о проблеме?

8
задан Bill the Lizard 12 April 2012 в 23:34
поделиться

3 ответа

Это потому, что вы добавили дополнительную точку:

 intent.putExtra("com.droidstogo.boom1."

Вместо:

 intent.putExtra("com.droidstogo.boom1"
1
ответ дан 5 December 2019 в 18:57
поделиться

Возможно, ваша проблема связана с каталогом, в котором вы пытаетесь сохранить файл. Для сохранения файлов на SD-карту вам не нужны особые разрешения , но способ получения ссылки на папку отличается от того, как вы это сделали. Это также зависит от того, хотите ли вы сохранить изображение таким образом, чтобы его можно было получить в MediaStore (например, такие вещи, как приложение для галереи или альбомов, или любое другое приложение, которое полагается на них для поиска изображений) или нет. Предполагая, что вы хотите, чтобы он был указан в MediaStore, вот код для этого:

ContentValues newImage = new ContentValues(2);
newImage.put(Media.DISPLAY_NAME, "whatever name you want shown");
newImage.put(Media.MIME_TYPE, "image/png");

Uri uri = contentResolver.insert(Media.EXTERNAL_CONTENT_URI, newImage);

try {
    Bitmap bitmap = //get your bitmap from the Camera, however that's done  
    OutputStream out = contentResolver.openOutputStream(uri);
    boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.close();
    if (success){
        Log.d("Image Writer", "Image written successfully.");                   
    } else {
        Log.d("Image Writer", "Image write failed, but without an explanation.");
    }

} catch (Exception e){
    Log.d("Image Writer", "Problem with the image. Stacktrace: ", e);
}

В моем эмуляторе, работающем под управлением v1.5, он успешно сохраняет растровое изображение на SD-карту в папке DCIM / Camera с текущим именем файла. время. (Время сохраняется в миллисекундах с 1 января 1970 года, почему-то также известного как «Эпоха».)

1
ответ дан 5 December 2019 в 18:57
поделиться
  1. Как сказал Стив Х, вы не можете просто использовать file: /// data / data / com.droidstogo.boom1 / files / parked.jpg для этого. Это личный каталог вашего приложения, и камера не может писать туда. Вы можете использовать, например, какой-нибудь файл с SD-карты - он доступен для всех.

  2. Как сказал Stealthcopter, дополнительное намерение - это просто MediaStore.EXTRA_OUTPUT без имени вашего пакета.

  3. Не проблема, только к вашему сведению. Я предполагаю, что ни одно из указанных вами разрешений на самом деле не требуется для этой операции.

Вот мой пример кода:

final int REQUEST_FROM_CAMERA=1;

private File getTempFile()
{
    //it will return /sdcard/image.tmp
    return new File(Environment.getExternalStorageDirectory(),  "image.tmp");
}

private void getPhotoClick()
{
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(getTempFile()));
  startActivityForResult(intent, REQUEST_FROM_CAMERA);
}


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == REQUEST_FROM_CAMERA && resultCode == RESULT_OK) {
    InputStream is=null;

    File file=getTempFile();
    try {
        is=new FileInputStream(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    //On HTC Hero the requested file will not be created. Because HTC Hero has custom camera
    //app implementation and it works another way. It doesn't write to a file but instead
    //it writes to media gallery and returns uri in intent. More info can be found here:
    //http://stackoverflow.com/questions/1910608/android-actionimagecapture-intent
    //http://code.google.com/p/android/issues/detail?id=1480
    //So here's the workaround:
    if(is==null){
        try {
            Uri u = data.getData();
            is=getContentResolver().openInputStream(u);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    //Now "is" stream contains the required photo, you can process it
    DoSomeProcessing(is);

    //don't forget to remove the temp file when it's not required. 
  }

}
7
ответ дан 5 December 2019 в 18:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: