2012-04-10 3 views
2

ich eine Intent für die Kamera am Brennen ein Foto aufzunehmen, wie folgt:Abrufen eines Inhalt Uri aus Kamera Intent

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
Uri myPhoto = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), 
    "the_photo.jpg")); 

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, myPhoto); 
startActivityForResult(cameraIntent, INTENT_GET_PICTURE_FROM_CAMERA); 

Jetzt möchte ich die Vorschau für das Foto bekommen zu zeigen. Wenn ich den "myPhoto" Uri speichere, kann ich genau die Datei im Dateisystem sehen. Um jedoch die Media Store-API zu verwenden, benötige ich die Uri im Content Uri-Formular. Gibt es da eh aus der Absicht die Kamera zurück zu holen und wenn nicht wie kann ich mein Dateisystem Uri in den Android Inhalt Uri umwandeln.

Hinweis, ich weiß, ich kann nur die Bitmap nehmen und entziffern, Downsampling, wie ich gehe. Das ist nicht was ich will. Ich kann alle Thumbnails abfragen und ich sehe, dass es existiert, also möchte ich es vom System bekommen.

Dank

Antwort

2

ich es gelöst, indem Sie auf das Element eines Medien Scan durchführen. Ich könnte den Inhalt Uri erhalten Von dort (die zusätzlichen Komplikation des Handlers im Code unten ist, weil ich mein Ergebnis benötigen auf dem UI-Thread behandelt werden, da es Ansichten manipulierte):

private Uri mCameraFilePath; 
private Context mContext; 
... 

private void handlePictureFromCamera(Intent data) { 

    MyMediaScannerClient client = new MyMediaScannerClient(
      mCameraFilePath.getPath(), new Handler(), new OnMediaScanned() { 

     @Override 
     public void mediaScanned(Uri contentUri) { 
      //Here I have the content uri as its now in the media store 
     } 
    }); 
    MediaScannerConnection connection = new MediaScannerConnection(mContext, client); 
    client.mConnection = connection; 
    connection.connect(); 
} 

private interface OnMediaScanned { 
    public void mediaScanned(Uri contentUri); 
} 

/** 
* This is used to scan a given file (image in this case) to ensure it is added 
* to the media store thus making its content uri available. It returns the 
* content form Uri by means of a callback on the supplied handler's thread. 
*/ 
private class MyMediaScannerClient implements MediaScannerConnectionClient { 

    private final String mPath; 
    private MediaScannerConnection mConnection; 
    private final OnMediaScanned mFileScannedCallback; 
    private final Handler mHandler; 

    public MyMediaScannerClient(String path, Handler handler, OnMediaScanned fileScannedCallback) { 
     mPath = path; 
     mFileScannedCallback = fileScannedCallback; 
     mHandler = handler; 
    } 

    @Override 
    public void onMediaScannerConnected() { 
     mConnection.scanFile(mPath, null); 
    } 

    @Override 
    public void onScanCompleted(String path, final Uri uri) { 

     mConnection.disconnect(); 
     mHandler.post(new Runnable() { 

      @Override 
      public void run() { 
       mFileScannedCallback.mediaScanned(uri); 
      } 
     }); 
    } 
} 
+0

Ich muss etwas ähnliches tun und ich konnte die Lösung nicht finden, können Sie mir sagen, wie/wo Sie "handlePictureFromCamera (Absicht)" nennen? Ich resorved den Weg, um den Inhalt uri, aber ich brauche wirklich den Rückruf – Jordi

+0

Ich rufe es direkt aus dem onActivityResult, wenn die Kamera fertig ist. – steprobe

0

AS i kommentiert, i brauchte etwas ähnliches (um "content: // media/external/images/xxx" uri-format zu bekommen) und deine lösung funktionierte ziemlich gut. Danke! Aber ich fand einen kürzeren Weg, es zu tun (vielleicht funktioniert es nicht für dich, aber für jemand anderen).

die gleiche Absicht Formulierung verwenden wie bei Ihnen (erster Post), aber mit dem "CAMERA_REQUEST"

innen onActivityResult

getContentResolver().notifyChange(mCapturedImageURI, null); 
    ContentResolver cr = getContentResolver(); 
    Uri uriContent = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), photo.getAbsolutePath(), null, null)); 

und bekommen die 'uriContent' in ‚Inhalt: // media/extern/images/xxx 'Format.