2017-12-13 23 views
0

사진을 촬영하여 SD 카드에 저장하는 카메라 활동을 구축하려고합니다. 그러나 나는 그의 코드가 File Uri와 putExtra() 메소드를 얻는 데 사용 된 메소드를 깨고있는 것을 발견했다.카메라의 PutExtra 메서드에 대해 Uri 파일을 가져올 수 없습니다.

함수를 호출하면 카메라 의도가 시작되지 않고 해당 활동이 종료됩니다.

<?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> 

카메라 기능을 사용하는 곳 된 InStore 활동은 다음과 같습니다

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; 
    } 
} 

는 그리고 이것은 내 매니페스트입니다. 이

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) 

고해상도/XML/file_paths.xml 실패 할 때

이것은 스택 트레이스입니다 :이 문제는 그게 다른 응용 프로그램의 읽기 파일을 허용하지 않습니다 지금은 안드로이드입니다

<?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

Android Nougat 7.0 SDK 24 용 앱을 구축 중입니다. – Ivan

+1

"내 코드가 깨졌습니다"라는 의미입니까? 충돌 했나요? 크래시가 로그를 게시하면. 그렇지 않다면 문제를 올바르게 설명하십시오. – ADM

+0

앱에 발생한 문제에 대한 설명을 추가했습니다 – Ivan

답변

1

왜 당신을 코드가 충돌합니다. 이 7.0 behaviour changes

이 튜토리얼 앱 읽고 거기에 기록 할 수 있도록 기본적으로 공유 파일의 위치를 ​​선언 FileProvider https://drivy.engineering/android-fileprovider/

사용하여 작업을 수행하는 참조를 참조하십시오. 그런 다음 파일을 만들고 해당 파일의 Uri를 사용하여 카메라 의도를 엽니 다.

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

Menfiest 파일 선언

<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> 

에게 마지막으로 내 경우

 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); 

에서

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

위의 코드가 작동 벌금.

코드를이 코드로 바꾸어보십시오.

그리고 귀하의 활동에서 이미지를 되찾기 위해 onActivityResult을 처리하십시오.

도와주세요!

+0

감사합니다! 이것은 완벽하게 작동했습니다. 문제가 Uri 파일을 얻는 방법에 있다고 생각했습니다. – Ivan