2017-12-13 5 views
0

kann nicht abgerufen werden Ich versuche, eine Kameraaktivität zu erstellen, die ein Foto aufnimmt und auf der SD-Karte speichert. Aber ich habe festgestellt, dass mein Code bei der Methode bricht, die verwendet wird, um die Datei Uri sowie die putExtra() Methode zu erhalten.Datei Uri für PutExtra-Methode für Kamera

Wenn die Funktion startCamera() aufgerufen wird, wird die Kameraabsicht nicht gestartet und die Aktivität wird beendet.

private void startCamera(int actionCode) { 
    //Create a camera intent 
    Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    switch (actionCode) { 
     case CAM_REQ_CODE: 
     File photo_file = null; 
     try { 
      photo_file = setUpPhotoFile(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      photo_file = null; 
      photo_path = null; 
     } 
     // Continue only if the File was successfully created 
     if (photo_file != null) { 
      photo_path = photo_file.getAbsolutePath(); 
      Uri photoURI = Uri.fromFile(photo_file); //works 
      //Uri photoURI = FileProvider.getUriForFile(InStore.this,"babygroot.iamgroot.fileprovider", photo_file); 
      // PROBLEM!! how to overcome putExtra method to pass photo URI to MediaStore.EXTRA_OUTPUT 
      camera_intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
      startActivityForResult(camera_intent, CAM_REQ_CODE); 
     } 
     break; 
     default: 
      break; 
    } 
} 

Und das ist mein Manifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="babygroot.iamgroot"> 

    <!-- To auto-complete the email text field in the login form with the user's emails --> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.READ_PROFILE" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

    <uses-feature android:name="android.hardware.camera" /> 
    <!--<uses-feature android:name="android.hardware.camera2" /> --> 
    <uses-feature android:name="android.hardware.camera.autofocus" /> 


    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="babygroot.iamgroot.fileprovider" 
      android:exported="false" 
      android:grantUriPermissions="true"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/file_paths"></meta-data> 
     </provider> 

     <activity android:name=".LoginScreen"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".QRCode" 
      android:parentActivityName=".LoginScreen" /> 
     <activity 
      android:name=".SignUp" 
      android:parentActivityName=".LoginScreen" /> 
     <activity 
      android:name=".InStore" 
      android:parentActivityName=".QRCode" /> 
     <activity android:name=".CheckOut" /> 
    </application> 

</manifest> 

Die InStore Aktivität ist, wo die Kamerafunktion verwendet wird.

Dies ist der Stacktrace, wenn es

Process: babygroot.iamgroot, PID: 26238 
    java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Pictures/IAMGROOTPics/IMG_20171213_141445_787397456.jpg 
        at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:712) 
        at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:401) 
        at babygroot.iamgroot.InStore.startCamera(InStore.java:172) 
        at babygroot.iamgroot.InStore.showCameraPreview(InStore.java:111) 
        at babygroot.iamgroot.InStore.access$000(InStore.java:28) 
        at babygroot.iamgroot.InStore$1.onClick(InStore.java:63) 
        at android.view.View.performClick(View.java:5646) 
        at android.view.View$PerformClick.run(View.java:22459) 
        at android.os.Handler.handleCallback(Handler.java:761) 
        at android.os.Handler.dispatchMessage(Handler.java:98) 
        at android.os.Looper.loop(Looper.java:156) 
        at android.app.ActivityThread.main(ActivityThread.java:6523) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 

res/xml/file_paths.xml versagt: jetzt erlauben

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="my_images" path="Android/data/com.example.package.babygroot.iamgroot/files/Pictures" /> 
</paths> 

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="my_images" path="Android/data/com.example.package.babygroot.iamgroot/files/Pictures" /> 
</paths> 
+0

Ich baue eine App für Android Nougat 7.0 SDK 24 – Ivan

+1

"Mein Code bricht" Was ist das? Ist es abgestürzt? Bei einem Absturz die Protokolle veröffentlichen. Wenn nicht, dann erkläre das Problem richtig. – ADM

+0

Ich habe die Beschreibung des Problems im erleben in App – Ivan

Antwort

1

Das Problem android ist Dateien nicht von anderen Anwendungen so thats lesen, warum Ihr Code stürzt ab. Sehen Sie diese 7.0 behaviour changes

dieses Tutorial Ihre Aufgabe zu tun FileProvider mit https://drivy.engineering/android-fileprovider/

Sie im Grunde eine gemeinsame Datei Lage erklären, so dass apps lesen und dort schreiben. Erstellen Sie dann dort eine Datei und verwenden Sie den URI dieser Datei, um die Kameraabsicht zu öffnen.

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <files-path name="shared" path="shared/"/> 
</paths> 

Menfiest Datei Erklärung

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="<your provider authority>" 
    android:exported="false" 
    android:grantUriPermissions="true"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/file_provider_paths"/> 
</provider> 

Schließlich

Uri sharedFileUri = FileProvider.getUriForFile(this, <your provider auhtority>, sharedFile); 
0

In meinem Fall

 ContentValues values = new ContentValues(); 
     values.put(MediaStore.Images.Media.TITLE, "Image File name"); 
     mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
     Intent intentPicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intentPicture.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 
     startActivityForResult(intentPicture,REQUEST_IMAGE_CAPTURE); 

Der obige Code funktioniert fein.

Versuchen Sie, Ihren Code mit diesem zu ersetzen.

Und handhaben Sie die onActivityResult für das Zurückbringen des Bildes in Ihrer Tätigkeit.

Hpe dies hilft!

+0

Vielen Dank! das hat perfekt funktioniert. Ich dachte, das Problem liege in der Art, wie die Datei Uri erhalten wurde. – Ivan

Verwandte Themen