2010-04-23 3 views
8

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

  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. Создание Intent (! Не забудьте имя 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, является: Файл: ///data/data/com.droidstogo.boom1/files/parked.jpg

  4. Я могу создать OK миниатюр (при не прикладывая дополнительный в Intent), и может написать, что файл ОК, а затем прочитать его обратно).

Может ли кто-нибудь увидеть, какую ошибку я делаю? В логарифме нет ничего очевидного - камера явно снимает изображение. Спасибо,

Питер


Следует отметить, что у меня есть соответствующие разрешения, заданные в файле 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> 

Любые идеи? Любые идеи о том, что нужно попробовать, чтобы узнать больше о проблеме?

+0

можно уложить код для лучшего понимания проблемы – the100rabh

+0

Возможно, этот вопрос [http://stackoverflow.com/questions/649057/how-do-i-save-data-from-camera-to- disk-using-mediastore-on-android) может помочь. – kgiannakakis

ответ

1

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

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

Вместо:.

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

Ваша проблема может быть с каталогом, который вы пытаетесь сохранить файл в Чтобы сохранять файлы на 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-карте в папке/Camera DCIM с его имя файла - текущее время. (Время сохраняется в миллисекундах, так как 1 января 1970, также известный как «Epoch» по какой-то причине.)

+0

Просто для nitpick ... для сохранения файлов на SDCard у вас должны быть разрешения. Я думаю, что это было изменено в 4-м уровне api. –

+0

@fiXedd: Просто чтобы закинуть взамен: P Оказывается, вы правы, что они ввели требование о том, чтобы разрешение write_external_storage записывалось на SD-карту. На v1.5 он работал нормально, но на v2.1 он требовал разрешения. Однако для записи в Media Store, как на 2.1, так и на 1.5, никаких разрешений не требовалось. –

7
  1. Как Steve H сказал, что вы не можете просто использовать файл: /// данные/данные/com.droidstogo.boom1/files/parked.jpg для этого. Это ваш частный каталог приложений, и камера там не умеет писать. Например, вы можете использовать некоторый файл SD-карты - он доступен для всех.

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

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

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

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. 
    } 

} 
0

Как сказал Стив, вы должны сохранить изображение в вашей SD карты. Каталог, в котором вы пытаетесь сохранить, является приватным, и, если у вас нет вашего устройства, вы не сможете его там написать. Попробуйте заменить эту строку:

String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg"; 

с этой линией

String fname = Environment.getExternalStorageDirectory().getAbsolutePath() + "somePathYouKnownExists" + +"/parked.jpg"; 

Этого должно быть достаточно.

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