代码之家  ›  专栏  ›  技术社区  ›  Ivan

无法获取摄像头PutExtra方法的文件Uri

  •  0
  • Ivan  · 技术社区  · 7 年前

    我正在尝试建立一个照相机活动,拍摄照片并将其保存到SD卡。但我发现我的代码在用于获取文件Uri的方法以及 putExtra() 方法

    startCamera() 调用函数时,相机意图不会启动并终止活动。

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

    这是我的清单:

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

    店内活动是使用摄像头功能的地方。

    这是失败时的堆栈跟踪

    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\u路径。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>
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Umar Hussain    7 年前

    问题是android现在不允许读取其他应用程序的文件,这就是你的代码崩溃的原因。看到这个了吗 7.0 behaviour changes

    请参阅本教程以使用FileProvider执行任务 https://drivy.engineering/android-fileprovider/

    基本上,您可以声明一个共享文件位置,以便应用程序可以在那里进行读写操作。然后在那里创建一个文件,并使用该文件的Uri打开camera intent。

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

    最后

    Uri sharedFileUri = FileProvider.getUriForFile(this, <your provider auhtority>, sharedFile);
    
        2
  •  0
  •   Shambhu    7 年前

    就我而言

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

    上述代码工作正常。

    尝试用此替换您的代码。

    并处理 onActivityResult 用于在活动中恢复图像。

    Hpe这很有帮助!