2012-11-15 12 views
8

Chciałbym zrobić zdjęcie z kamery i zapisać je w prywatnym katalogu pamięci podręcznej aplikacji. Zdaję sobie sprawę, że muszę zezwolić aplikacji na kamerę na pisanie do mojego prywatnego katalogu, dlatego dodałem flagę FLAG_GRANT_WRITE_URI_PERMISSION.Przechowuj obraz z kamery do prywatnego katalogu pamięci podręcznej aplikacji.

Co się dzieje, że aplikacja aparatu otwiera się, mogę zrobić zdjęcie, ale gdy klikam przycisk OK, nic się nie dzieje. Aplikacja aparatu pozostaje otwarta. Brak danych wyjściowych dziennika. Myślę, że to z powodu problemu z uprawnieniami.

private void getCameraImage() { 
    try { 
     mTmpFile = File.createTempFile("tmp", ".jpg", getCacheDir()); 
     Uri imgUri = Uri.fromFile(mTmpFile); 
     Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     i.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); 
     i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     // i.setData(imgUri); // if uncommented, i get an ActivityNotFound Exception 
     startActivityForResult(i, REQUEST_CAMERA); 
    } catch (IOException e) { 
     Log.e(TAG, "getCameraImage()", e); 
     Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show(); 
    } 
} 

Wszelkie spostrzeżenia, w jaki sposób mogę to poprawić?

Edit:

Kiedy zmienić katalog na karcie SD publicznym, to działa dobrze.

mTmpFile = File.createTempFile("tmp", ".jpg", Environment.getExternalStorageDirectory()); 

Dzięki Simon

+1

Jeśli był to problem z uprawnieniami, w LogCat pojawiłby się błąd. – PearsonArtPhoto

+0

Nie jestem tego pewien. Nawet gdy usuwam flagę FLAG_GRANT_WRITE_URI_PERMISSION, nie otrzymuję żadnych wyników dziennika. Może aplikacja kamery sprawdza uprawnienia i po prostu przerywa działanie, jeśli nie może zapisać pliku. – SimonSays

Odpowiedz

2

Zamiast przechodzenia URI do przechowywania obrazu można użyć http://developer.android.com/reference/android/hardware/Camera.html#takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera. PictureCallback)

i pobierz zawartość do pamięci aplikacji. Stamtąd będziesz mógł zrobić wszystko, co chcesz.

Nie zapominaj, że w aplikacjach aparatu używana jest również galeria, a aplikacja Galeria nie może sprawdzać Twojego prywatnego katalogu.

+0

To jest zupełnie inny sposób uzyskania obrazu niż to, co zamierzałem. W rzeczywistości nie jest to odpowiedź na oryginalne pytanie, ale nadal może rozwiązać problem. Ponieważ nie pracuję już nad tą aplikacją i dlatego nie mogę przetestować rozwiązania, po prostu pójdę dalej i zaakceptuję odpowiedź - to jedyna i tak :-) – SimonSays

+0

Wielkie dzięki za uznanie i tak nie jest bezpośredni odpowiedź na twoje pytanie, ale jak powiedziałeś, jest to jedyna możliwość zrobienia czegoś, co "należy" tylko do twojej aplikacji, a nie do żadnej innej, która używa mediów. Użyłem tej metody samodzielnie ... Dzięki – danysz

+0

To rozwiązanie było przestarzałe w interfejsie API 21 –

Powiązane problemy