2010-04-23 11 views
8

Mężczyzna, jestem nadal nie mogę zapisać zdjęcia, gdy wysyłam wiadomość z prośbą o zrobienie zdjęcia. Oto, co robię:Problemy z zapisywaniem zdjęcia do pliku

  1. Zrób URI reprezentujący ścieżkę

    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. Tworzenie Intent (! Nie zapomnij o nazwie pkg) i rozpocząć działalność

    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. Rozpocznie się działanie kamery i mogę zrobić zdjęcie, i zatwierdzić. Mój onActivityResult() zostaje następnie wywołany. Ale mój plik nie zostanie zapisany. URI jest: file: ///data/data/com.droidstogo.boom1/files/parked.jpg

  4. mogę utworzyć OK miniatur (nie przez wprowadzenie dodatkowych do Intent) i może napisać, że plik OK, a następnie przeczytaj go z powrotem).

Czy ktoś może zobaczyć, jaki błąd popełniam? Nic nie jest widoczne w logcat - kamera wyraźnie robi zdjęcie. Dzięki,

Peter


należy wspomnieć, że mam odpowiednie uprawnienia określone w pliku 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> 

jakieś pomysły? Jakieś pomysły na rzeczy, które można wypróbować, aby uzyskać więcej informacji o problemie?

+0

Czy możesz podać kod, aby lepiej zrozumieć problem? – the100rabh

+0

Być może to [pytanie] (http://stackoverflow.com/questions/649057/how-do-i-save-data-from-camera-to- disk-using-mediastore-on-android) może pomóc. – kgiannakakis

Odpowiedz

1

Czy to dlatego, że dodaliśmy dodatkowy punkt:

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

Zamiast:.

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

Twój problem może być z katalogu, który próbujesz zapisać plik w celu zapisz pliki na karcie SD, nie potrzebujesz żadnych specjalnych uprawnień, ale sposób, w jaki uzyskujesz odniesienie do folderu, różni się od sposobu, w jaki zrobiłeś. Zależy to również od tego, czy chcesz zapisać obraz w sposób, który może być pobrany przez MediaStore (tj. Takie rzeczy, jak aplikacja galerii lub albumów, czy jakakolwiek inna aplikacja, która polega na wyszukiwaniu obrazów) lub nie. Zakładając, że ma to być wymienione w Mediastore, oto kod, aby to zrobić:

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); 
} 

Na moim emulatora systemem v1.5, który jest z powodzeniem ratuje bitmapę na karcie SD w folderze/kamera DCIM z jego nazwa pliku jest aktualna. (Czas jest zapisywany w milisekundach od 01 stycznia 1970, znany również jako „Epoki” z jakiegoś powodu.)

+0

Wystarczy nacisnąć ... aby zapisać pliki na karcie SD, musisz mieć uprawnienia. Myślę, że to się zmieniło na poziomie api 4. –

+0

@fiXedd: Tylko po to, żeby wytrzepać w zamian: P Okazuje się, że masz rację, że wprowadzono wymóg posiadania pozwolenia write_external_storage na zapisywanie na karcie SD. Na v1.5 działało bez niego, ale na v2.1 wymagało pozwolenia. Jednak, aby napisać do Media Store, zarówno w wersji 2.1, jak i 1.5 nie wydawało się wymagane żadne uprawnienia. –

7
  1. Jak Steve H powiedział, że nie można po prostu użyć file: /// data/data/com.droidstogo.boom1/files/parked.jpg do tego. To twój prywatny katalog aplikacji i kamera nie może tam pisać. Możesz użyć na przykład pliku karty SD - jest on dostępny dla wszystkich.

  2. Jak powiedział Stealthcopter, intent extra to po prostu MediaStore.EXTRA_OUTPUT bez nazwy pakietu.

  3. Nie jest to problem tylko dla FYI. Domyślam się, że żadne z podanych uprawnień nie jest wymagane dla tej operacji.

Oto mój przykładowy kod:

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

Jak powiedział Steve, należy zapisać obraz na karcie SD. Katalog, w którym próbujesz zapisać, jest prywatny i jeśli nie masz zrootowanego urządzenia, nie możesz tam pisać. Spróbuj zastąpić ten wiersz:

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

z tej linii

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

To powinno wystarczyć.

Powiązane problemy