2013-07-24 14 views
8
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    filePath = getOutputMediaFile(FileColumns.MEDIA_TYPE_IMAGE); 
    File file = new File(filePath); 
    Uri output = Uri.fromFile(file); 
    Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    i.putExtra(MediaStore.EXTRA_OUTPUT, output); 
    startActivityForResult(i, RETURN_FILE_PATH); 
} 

    @Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    //data is always null here. 
    //requestCode = RETURN_FILE_PATH; 
    //resultCode = Activity.RESULT_OK; 
} 

Sprawdziłem wartości pliku i wyjściu Uri, oba są w porządku, a schwytany obraz rzeczywiście istnieje w tym miejscu.onActivityResult zwraca dane zerowe dla obrazu przechwytywania

Ale dane zwrócone w onActivityResult są zawsze null nawet po przechwyceniu obrazu.

EDIT:

Sprawdziłem to pytanie:

onActivityResult returns with data = null

który mówi:

Kiedykolwiek zapisać obraz przekazując EXTRAOUTPUT z kamery zamiarem parametr dane wewnątrz funkcji onActivityResult zawsze zwracana jest wartość null. Tak więc, zamiast używać danych do pobrania obrazu, użyj ścieżki do pliku , aby pobrać mapę bitową.

i może to rozwiązanie będzie dla mnie skuteczne. Ale powyższy kod był działającym kodem do tej pory dla tego samego scenariusza.

Odpowiedz

18

Zgodnie z tym post dane mają wartość zerową, gdy wcześniej wstawiłeś uri. To znaczy, że już zdefiniowałeś swój wyjściowy kod:

i.putExtra(MediaStore.EXTRA_OUTPUT, output); 

Kiedy otrzymasz Activity.RESULT_OK; wystarczy załadować zrobione zdjęcie za pomocą jego znanego adresu URL.

+0

Tak, widziałem ten post. Ale ten sam kod działał przez ostatnie 6 miesięcy, dlaczego nagle zachowuje się w ten sposób :( –

+1

Niestety nie jestem ekspertem w tym temacie, zakładam, że jest to specyficzna dla urządzenia funkcjonalność związana ze sprzętem. na urządzeniach Samsung występuje inne zachowanie: http://stackoverflow.com/q/8248327/1965084 – alex

0

Po prostu Umieść ten kod w swoim onActivityResult. Ten sam problem, z którym miałem do czynienia na niektórych urządzeniach, rozwiązał mój problem. Mam nadzieję, że to również ci pomoże.

try { 

    Uri selectedImage = output; 

    if (selectedImage == null) 
     return; 

    String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
    cursor.moveToFirst(); 
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
    String picturePath = cursor.getString(columnIndex); 
    cursor.close(); 

} catch (Exception e) { 
    return; 
}  

Dostaniesz ścieżkę Picture in picturePath zmiennej i Uri w selectedImage zmienny.

1

Spróbuj tego kodu, który działa dla mnie.

else if(requestCode == Constant.PICK_FROM_CAMERA) 
      { 

       if (resultCode == Activity.RESULT_OK) 
       { 
        if(data!=null) 
        { 
         mImageCaptureUri = data.getData(); 
         //path= mImageCaptureUri.getPath(); 
         try 
         { 
          path = getPath(mImageCaptureUri,Wonderlistpage.this); //from Gallery 
         } 
         catch(Exception e) 
         { 
          path = mImageCaptureUri.getPath(); 
          Log.i("check image attach or not", e.toString()); 
         } 

         String arr[] = path.split("/"); 
         int i; 
         String k = null; 
         for(i=0;i<arr.length;i++) 
         { 
          k=arr[i];  
         } 
         photoname="_"+String.valueOf(System.currentTimeMillis()) +k; 
         if(setprofileimage_sendimagewithmessage==1) 
         { 
          performCrop(mImageCaptureUri); 
         } 
         else 
         { 
           loading_details="CAMERA"; 
           new performBackgroundTask33().execute(); 
         } 
        } 
        else 
        { 
file1 = new File(Environment.getExternalStorageDirectory(), 
            String.valueOf(System.currentTimeMillis()) + "_FromCamera.jpg"); 

         Uri mImageCaptureUri = Uri.fromFile(file1); 
         try 
         { 
          path = getPath(mImageCaptureUri,Wonderlistpage.this); //from Gallery 
         } 
         catch(Exception e) 
         { 
          path = mImageCaptureUri.getPath(); 
          Log.i("check image attach or not", e.toString()); 
         } 
         String arr[] = path.split("/"); 
         int i; 
         String k = null; 
         for(i=0;i<arr.length;i++) 
         { 
          k=arr[i];  
         } 
         photoname="_"+String.valueOf(System.currentTimeMillis()) +k; 
         if(setprofileimage_sendimagewithmessage==1) 
         { 
          performCrop(mImageCaptureUri); 
         } 
         else 
         { 
           loading_details="CAMERA"; 
           new performBackgroundTask33().execute(); 
         } 

        } 

        //new UploadTask().execute(); 
       } 
      } 
1

Spróbuj poniższy kod

 { 
      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); 
      imageCursor.moveToFirst(); 
      do { 
       String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
       if (fullPath.contains("DCIM")) { 

        //get bitmap from fullpath here. 
        return; 
       } 
      } 
      while (imageCursor.moveToNext()); 
0

Jeśli działalność ma launchmode jak singleInstance w swoim manifeście wtedy można zmierzyć się z tym problem. Spróbuj to zmienić. Ponieważ anuluje wynik za każdym razem.