2014-07-01 11 views
6

Ich habe eine Menge Fragen zu diesem Problem gelesen. Manche ähneln denen, die ich erlebe; Ich habe die Antworten ohne Erfolg versucht. Der Code funktioniert auf einem HTC Android 4.2 und funktioniert nicht auf einem Nexus 7 Android 4.4. Ich habe das Speicherverzeichnis geändert, um auf Android 4.4 zu funktionieren, also ist das nicht das Problem.Camera Intent nicht zum Aufruf Aktivität

Die Kamera Absicht gibt nie, wenn ich

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 

verwenden und nicht zurück, wenn ich

verwenden
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoFile); 

aber nicht die Datei speichern.

Hier ist der vollständige Code. Rufen Sie die Absicht

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (takePictureIntent.resolveActivity(manager) != null) 
{ 
    try 
    { 
     final File photoFile = createImageFile(); 

     if (photoFile != null) 
     { 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
      //takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoFile); 
      startActivityForResult(takePictureIntent, 1); 
     } 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

Der Dateiname

private File createImageFile() throws IOException 
{ 
    if (mStorageDirectory == null) 
    { 
     createInitialStorageDirectory(); 
     setupFolders(); 
     mScrollList.notifyDataSetInvalidated(); 
    } 

    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "slide_" + timeStamp; 
    File storageDir = new File(mStorageDirectory); 
    File image = File.createTempFile(imageFileName, ".jpg", storageDir); 
//  image.setWritable(true, false); 

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

die Callback-Funktion

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 1 && resultCode == -1) 
    { 

    } 
} 

Das Root-Verzeichnis plus speichern Verzeichnis

static String mBasePath = "/slides/"; 

private String getRootDirectory() 
{ 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) 
    { 
     if (Build.VERSION.SDK_INT >= 19) 
      return mView.getContext().getFilesDir() + mBasePath; 
     else 
      return Environment.getExternalStorageDirectory() + "/Android/data/com.hdms.manager" + mBasePath; 
     //return Environment.getExternalStorageDirectory() + mBasePath; 
    } 

    return mBasePath; 
} 

Irgendwelche Gedanken w würde geschätzt werden.

Antwort

6

So habe ich eine Lösung für mein Problem gefunden. Wenn eine Datei nicht existiert, wird die Kameraaktivität nicht zurückgegeben. Ich denke, der Grund, dass es unter 4.4 nicht funktioniert, ist die Änderung des Dateisystems. Ich speichere das Bild nicht in der Mediengalerie und lade die Datei zurück in mein Apps-Verzeichnis. Die Mediendatei wird dann gelöscht. Der Grund, dass ich es nicht im Medienverzeichnis belasse, ist, wenn die App gelöscht wird, damit die Bilder gelöscht werden.

Hier ist der neue Code. Zuerst der Absichtsabruf

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (takePictureIntent.resolveActivity(manager) != null) 
{ 
    ContentValues values = new ContentValues(); 
    values.put(MediaStore.Images.Media.TITLE, "New Picture"); 
    values.put(MediaStore.Images.Media.DESCRIPTION,"From your Camera"); 
    Uri mImageUri = App.mApplication.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

    mCurrentPhotoPath = mImageUri.getPath(); 

    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); 
    startActivityForResult(takePictureIntent, 1); 
} 

Dann der Rückruf.

+0

Dank dieser Code funktioniert :) – chathura

6

In meinem Fall kam es nicht zurück, weil die Ausgabedatei in einem Ordner war, den ich noch nicht erstellt habe.

Wenn es der Fall für jemand anderes ist, dies zu tun, bevor anintent:

file.getParentFile().mkdirs(); 
+5

Ist es nicht ein Android-Framework Bug, der es in Android-Konsole ist kein IOException (zB NoSuchFileOrDirecrtoy) oder ein Protokoll-Trace, um uns über den Grund zu informieren, warum die Aktivität blockiert ist? wie sollen wir verstehen, was passiert ist (abgesehen von der Öffnung des Stack Overflow ...) – GyRo

+0

Vielen Dank ... ich habe viel Zeit verbracht, endlich gelöst ... –