2012-04-05 8 views
2

Ich könnte Hilfe verwenden, um zu verstehen, wie Sie Dateien in Android öffnen. Mein spezielles Problem hat mit dem Öffnen einer Bilddatei zu tun. In meiner Anwendung nimmt der Benutzer ein Bild mit einer Kamera-App seiner Wahl und dann arbeite ich mit dem Bild, das zurückgegeben wird. Je nach Telefon, Version von Android und der gewählten Kamera-App werden in onActivityResult verschiedene Parameter zurückgegeben. Manchmal bekomme ich eine URI, manchmal nur ein Bild und manchmal beides.Datei von Uri öffnen, unabhängig von der Position in Android

Der Code für die Kamera gestartet ist:

Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(i, CAMERA_IMAGE); 

ich das Ergebnis nach wie vor erhalten:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == CAMERA_IMAGE && resultCode == Activity.RESULT_OK) { 
     Log.d(TAG,"In onActivityResult"); 
     Bitmap imageBmp = null; 
     Uri imageUri = data.getData(); 

     if (data.getExtras() != null) { 
     imageBmp = (Bitmap)data.getExtras().get("data"); 
     Log.d(TAG,"Got Bitmap"); 
     } 
     ... 
    } 
} 

Mein Problem entsteht, wenn ich einen URI bekommen, aber kein Bild. Wenn imageBmp null ist, muss ich das Bild vom URI laden. Ich habe dies aus mehreren Geräte/App-Kombinationen getestet. Manchmal befindet sich der URI im internen Speicher und manchmal auf der SD-Karte. Wenn sich die Datei auf der SD-Karte befindet, habe ich mit managedQuery die Datei abgerufen.

String[] proj = { MediaStore.Images.Media.DATA }; 
Cursor cursor = managedQuery(imageUri, proj, null, null, null); 
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);       
cursor.moveToFirst(); 
imageFileName = cursor.getString(column_index); 
File imageFile = new File(imageFileName); 
... 

Wenn es auf dem internen Speicher ist, dann bekomme ich eine FileNotFoundException.

Meine spezifische Frage ist: Wie kann ich dies ändern, um eine Datei unabhängig davon zu öffnen, wo es im Dateisystem ist, nur die URI kennen? Ich möchte wie etwas tun:

File imageFile = new File(imageUri); 

aber Datei kein Uri Objekt übernehmen. Ich mache die verwaltete Abfrage, um es in einen String zu konvertieren.

Meine allgemeinere Frage ist, warum muss ich die Abfrage an erster Stelle tun? Warum kann ich nicht einfach den zurückgegebenen URI verwenden?

Antwort

0

Sie machen alles richtig. Sie haben einen Dateinamen. Öffne es einfach. Das ist es.

+0

ich die Frage bearbeitet zu zeigen, dass ich mit diesem Ansatz nur dann erfolgreich bin, wenn die Datei auf dem externen Speicher ist. Manchmal zeigt der Uri auf den internen Speicher und ich finde die Datei nicht. –

8

Sie müssen eine contentResolver verwenden interne Dateien weitergegeben zuzugreifen, als uri

ContentResolver cr = getContentResolver(); 
InputStream is = cr.openInputStream(imageUri); 
Verwandte Themen