2010-04-28 15 views
81

Ich muss eine Absicht zu Standard-Kamera-Anwendung drücken, damit es ein Foto machen, speichern Sie es und einen URI zurück. Gibt es eine Möglichkeit, dies zu tun?Android Kamera Absicht

+0

Siehe den Link unten http://stackoverflow.com/questions/13977245/android-open-camera-from-button/40041381#40041381 –

Antwort

161
private static final int TAKE_PICTURE = 1;  
private Uri imageUri; 

public void takePhoto(View view) { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, 
      Uri.fromFile(photo)); 
    imageUri = Uri.fromFile(photo); 
    startActivityForResult(intent, TAKE_PICTURE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) { 
    case TAKE_PICTURE: 
     if (resultCode == Activity.RESULT_OK) { 
      Uri selectedImage = imageUri; 
      getContentResolver().notifyChange(selectedImage, null); 
      ImageView imageView = (ImageView) findViewById(R.id.ImageView); 
      ContentResolver cr = getContentResolver(); 
      Bitmap bitmap; 
      try { 
       bitmap = android.provider.MediaStore.Images.Media 
       .getBitmap(cr, selectedImage); 

       imageView.setImageBitmap(bitmap); 
       Toast.makeText(this, selectedImage.toString(), 
         Toast.LENGTH_LONG).show(); 
      } catch (Exception e) { 
       Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT) 
         .show(); 
       Log.e("Camera", e.toString()); 
      } 
     } 
    } 
} 
+0

Gibt es die Möglichkeit, eine Frontkamera des Gerätes vorsätzlich zu öffnen? – Dimon

+4

Das funktioniert gut, obwohl Sie möglicherweise benötigen: private statische int TAKE_PICTURE = 1; –

+0

@Aleksander O. - toller Code, danke!Ich habe eine vollständige voll funktionsfähige Implementierung dieser bei http://StackOverflow.com/A/13446838/1166727 –

18

Versuchen Sie Folgendes ich here gefunden

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
startActivityForResult(intent, 0); 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK && requestCode == 0) { 
    String result = data.toURI(); 
    // ... 
    } 
} 
+1

Danke, aber die Bild der Einsparung ist nicht auf ein Gerät, so bekomme ich FileNotFoundException in Uri uri = Uri.parse (data.toURI()); bitmap = android.provider.MediaStore.Images.Media .getBitmap (contentResolver, uri); –

+0

Sagst du, dass das Bild, das du machst, nicht auf dem Telefon/Gerät gespeichert wird oder etwas passiert und obwohl du sagst, dass es das Bild auf deinem Handy/Gerät speichern soll, verhält es sich so, als würde es nicht speichern? – Ryan

+0

Ich sage, dass das Bild nicht automatisch auf dem Gerät gespeichert wird, sondern in onActivityResult() als Bitmap zurückgegeben wird. Ich habe jedoch eine Lösung gefunden, die ich in einer Antwort erwähnen werde. –

0

versuchen diesen Code

Intent photo= new Intent("android.media.action.IMAGE_CAPTURE"); 
        startActivityForResult(photo, CAMERA_PIC_REQUEST); 
+4

Dieser Beitrag wird automatisch als minderwertig gekennzeichnet, da es sich nur um Code handelt. Würde es Ihnen etwas ausmachen, es zu erweitern, indem Sie etwas Text hinzufügen, um zu erklären, wie es das Problem löst? – gung

6

Es dauerte einige Stunden, um diese Funktion zu erhalten. Der Code ist fast eine Kopie-Paste von developer.android.com, mit einem kleinen Unterschied.

Antrag diese Erlaubnis auf der AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Auf Ihrem Activity, durch die Definition dieser beginnen:

static final int REQUEST_IMAGE_CAPTURE = 1; 
private Bitmap mImageBitmap; 
private String mCurrentPhotoPath; 
private ImageView mImageView; 

Dann feuern diese Intent in ein onClick:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (cameraIntent.resolveActivity(getPackageManager()) != null) { 
    // Create the File where the photo should go 
    File photoFile = null; 
    try { 
     photoFile = createImageFile(); 
    } catch (IOException ex) { 
     // Error occurred while creating the File 
     Log.i(TAG, "IOException"); 
    } 
    // Continue only if the File was successfully created 
    if (photoFile != null) { 
     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
     startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE); 
    } 
} 

hinzufügen das folgende unterstützt mich thod:

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, // prefix 
      ".jpg",   // suffix 
      storageDir  // directory 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

erhalten dann das Ergebnis:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     try { 
      mImageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)); 
      mImageView.setImageBitmap(mImageBitmap); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Was die MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(mCurrentPhotoPath)), es Arbeit ist gemacht, die aus dem Code von developer.android.com unterscheidet. Der ursprüngliche Code gab mir eine FileNotFoundException.

+0

Das gleiche für mich. Du hast mir ein paar Stunden gespart. Irgendeine Idee, warum der Android Dev-Code eine IO-Ausnahme gibt? – Coo

0

Versuchen Sie, die folgenden I a link

hier gefunden Wenn Ihre App Ziele M und vor und erklärt, wie die Kamera die Erlaubnis verwendet, die nicht erteilt wird, dann in einem Security führt diese Aktion zu nutzen versuchen.

EasyImage.openCamera(Activity activity, int type);

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

    EasyImage.handleActivityResult(requestCode, resultCode, data, this, new DefaultCallback() { 
     @Override 
     public void onImagePickerError(Exception e, EasyImage.ImageSource source, int type) { 
      //Some error handling 
     } 

     @Override 
     public void onImagesPicked(List<File> imagesFiles, EasyImage.ImageSource source, int type) { 
      //Handle the images 
      onPhotosReturned(imagesFiles); 
     } 
    }); 
} 
Verwandte Themen