2011-10-03 18 views
16

Chcę zrobić zdjęcie z intencją kamery i zapisać ją w domyślnym folderze DCIM. Następnie chcę uzyskać ścieżkę/nazwę pliku, w którym przechowywane jest zdjęcie.Uzyskaj ścieżkę i nazwę pliku z wyniku zamiaru kamery

próbuję go z następującego kodu:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, TAKE_PICTURE); 

Z tym kodem, aparat otwiera i po wziąłem jeden obraz zamyka i zapisuje obraz w domyślnym folderze obrazu (zwykle/DCIM/camera lub sdcard/dcim/camera ...)

ale jak mogę teraz uzyskać ścieżkę i nazwę pliku zrobionego zdjęcia? Próbowałem prawie wszystko w onActivityResult próbowałem

String result = data.getData(); 

i

String result = data.getDataString(); 

i

String result = data.toURI(); 

i

Uri uri = data.getData(); 

e tc.

Przeanalizowałem ostatnie dwa dni, aby znaleźć rozwiązanie tego problemu, jest wiele artykułów w sieci i na stackoverflow, ale nic nie działa. Nie chcę miniatury, chcę tylko ścieżki (uri?) Do obrazu, który zrobiła kamera.

Dziękuję za wszelką pomoc

EDIT: Kiedy próbuję:

path=Environment.DIRECTORY_DCIM + "/test.jpg"; 
File file = new File(path); 
Uri outputFileUri = Uri.fromFile(file); 
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
startActivityForResult(intent, TAKE_PICTURE); 

nie przechowuje obraz jako test.jpg ale z normalnym nazwy obrazu 2011-10-03 .. ... jpg (ale to też jest ok, potrzebuję tylko ścieżki do obrazu, nie ma znaczenia, jak się nazywa).

poważaniem

EDIT Ponownie

path=Environment.getExternalStorageDirectory().getPath() + "/DCIM/Camera/"; 
File file = new File(path,"test111111111.jpg"); 
try { 
file.createNewFile(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
Uri outputFileUri = Uri.fromFile(file); 
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

startActivityForResult(intent, TAKE_PICTURE); 

Kiedy próbuję to, przechowuje obraz do prawego folderu i o podanej nazwie (np test111111.jpg). Ale jak mogę teraz dodać ścieżkę do pliku onActivityResult?

+6

ciebie Allready znać ścieżkę ... od czasu utworzenia pliku. możesz zachować plik lub ścieżkę jako zmienną członkowską swojej Aktywności –

Odpowiedz

1

Po uruchomieniu ACTION_IMAGE_CAPTURE możesz przekazać dodatkową MediaStore.EXTRA_OUTPUT jako plik URI pliku, w którym chcesz zapisać zdjęcie.

Oto prosty przykład:

File file = new File(path); 
    Uri outputFileUri = Uri.fromFile(file); 

    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

    startActivityForResult(intent, TAKE_PICTURE); 

EDIT: prostu próbowałem na moim urządzeniu i file.createNewFile() rozwiązał problem dla mnie.

+0

Witam, dziękuję za szybką odpowiedź, ale nie działa zgodnie z oczekiwaniami. Wyjaśnię powyżej. – bihcoder

+0

Odpowiedziałem powyżej z kodem. – bihcoder

+0

głupie pytanie może ... czy dodałeś pozwolenie w Manifeście? android.permission.CAMERA? tak ... może pracować bez pozwolenia kilka razy –

6

Zdjęcie zostanie zapisane dwukrotnie, najpierw w folderze galerii, a następnie w pliku, który został szczegółowo określony w metodzie putExtra (MediaStore.EXTRA_OUTPUT, ścieżka).

można uzyskać najnowsze zdjęcie robi że:

/** 
* Gets the last image id from the media store 
* @return 
*/ 
private int getLastImageId(){ 
    final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA }; 
    final String imageOrderBy = MediaStore.Images.Media._ID+" DESC"; 
    Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy); 
    if(imageCursor.moveToFirst()){ 
     int id = imageCursor.getInt(imageCursor.getColumnIndex(MediaStore.Images.Media._ID)); 
     String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
     Log.d(TAG, "getLastImageId::id " + id); 
     Log.d(TAG, "getLastImageId::path " + fullPath); 
     imageCursor.close(); 
     return id; 
    }else{ 
     return 0; 
    } 
} 

Próbka ta została oparta na stanowisko: Deleting a gallery image after camera intent photo taken

+1

Hej, ten kod działa na karcie Samsung, ale nie działa na karcie lenovo i i-ball, czy jest jakieś inne rozwiązanie ????? – Shubham

1

można korzystać tak w onActivityResult()

if(requestCode==CAMERA_CAPTURE) 
    { 

     Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, new String[]{Media.DATA, Media.DATE_ADDED, MediaStore.Images.ImageColumns.ORIENTATION}, Media.DATE_ADDED, null, "date_added ASC"); 
     if(cursor != null && cursor.moveToFirst()) 
     { 
      do 
      { 
       String picturePath =cursor.getString(cursor.getColumnIndex(Media.DATA)); 
       Uri selectedImage = Uri.parse(picturePath); 

      } 
      while(cursor.moveToNext()); 
       cursor.close(); 
      File out = new File(picturePath); 
      try 
      { 
       mOriginal = decodeFile(out); 
      } 
      catch (IOException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


      mSelected.setImageBitmap(mOriginal); 
     } 
    } 
Powiązane problemy