2012-05-17 12 views
9

Mam do czynienia z problemem z analizą uri podjętego zdjęcia do aktywowania upraw. W mojej aplikacji użytkownicy mogą zrobić zdjęcie lub wybrać je z galerii, a następnie przyciąć i przesłać. Wszystko brzmi prosto.Android: Wywołanie aktywności upraw po zrobieniu zdjęcia

Kiedy wybrać z menu Galeria, Galeria aplikacja zwróci URI dla wybranego zdjęcia tak:

content://media/external/images/media/20 

rozpocząć działalność plonów z tego URI wykonując kod, wszystko wydaje się w porządku:

Intent intent = new Intent("com.android.camera.action.CROP"); 
intent.setData(uri); 
intent.putExtra("outputX", 96); 
intent.putExtra("outputY", 96); 
intent.putExtra("aspectX", 1); 
intent.putExtra("aspectY", 1); 
intent.putExtra("scale", true); 
intent.putExtra("return-data", true);    
startActivityForResult(intent, REQUEST_CODE_CROP); 

Ale kiedy robię zdjęcie, mogę znać tylko ścieżkę zdjęcia w następujący sposób:

file:///mnt/sdcard/iBet88.us/IMAGE_20120517_151606.jpg 

i przycinanie Aktywność nie zaakceptuje tego URI. Próbowałem inny sposób z dostawca treści: dodawanie nowo zrobione zdjęcie do ContentProvider, a następnie dostać nowy URI w sheme „treść: // ...” z następującym kodem:

// TODO insert to Content Provider 
ContentResolver cr = getContentResolver(); 
ContentValues contentValues = new ContentValues(); 
contentValues.put(MediaStore.Images.Media.DATA, avatarFilePathTmp.getPath()); 
contentValues.put(MediaStore.Images.Media.IS_PRIVATE, 0); 
cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); 

// TODO get id from Content Provider 
String[] projection = { 
    MediaStore.Images.Media._ID, 
    MediaStore.Images.Media.DATA 
}; 
String selectionClause = "" + MediaStore.Images.Media.DATA + " = ?"; 

String[] selectionArgs = {avatarFilePathTmp.getPath()}; 
Cursor mCursor = getContentResolver().query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
    projection, 
    selectionClause, 
    selectionArgs, 
    ""); 

Uri uri = null;  
if (null == mCursor) { 

} else if (mCursor.getCount() < 1) { 

} else { 
    mCursor.moveToFirst(); 
    int id = mCursor.getInt(mCursor.getColumnIndex(MediaStore.Images.Media._ID)); 

    String u = "content://media/external/images/media/" + id; 

    // create new Uri 
    uri = Uri.parse(u); 
} 

My new Uri jest podobna do URI z galerii aplikacji, ale kiedy rozpocząć działalność upraw nowej Uri, otrzymuję ten wyjątek:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.android.camera.action.CROP dat=content://media/external/images/media/20 (has extras) } 

moje pytania:
1. Dlaczego aktywny Crop odmawia pracy z moim nowym Uri, pomimo mojego nowy Uri i uri z aplikacji Gallery mają tę samą "treść: // ..."
2. Jak mogę wywołać funkcję Crop Activity, aby przyciąć zdjęcie w sdcard, które znam tylko na jego ścieżce?

Próbowałem google, ale wciąż nie mam szczęścia.
Przepraszamy za mój zły angielski. Dziękuję Ci.

+0

Czy to działa dla Ciebie? – Darpan

Odpowiedz

30

miałem intent.setType("image/*"); i nadal nie działa ...

Co rozwiązać go dla mnie było za pomocą: intent.setDataAndType(tempImageURI, "image/*");

Powodzenia!

+1

gdzie i jak korzystać z tempImageURI? – erdomester

+1

ta odpowiedź jest poprawna. Miałem intent.setType ("image/*") i intent.setData (uri) w oddzielnych wierszach i tylko obraz wybrany z galerii pracował. Używanie setDataAndType (uri, "image/*") współpracowało z innymi aplikacjami, takimi jak Astro i Dropbox. – jfortunato

Powiązane problemy