首页 > 解决方案 > FileProvider.getUriForFile() 崩溃的应用程序?

问题描述

我按照这个 youtube 教程向我的应用程序添加了一个相机按钮,但是当它到达时应用程序似乎崩溃了

val fileProvider = FileProvider.getUriForFile(this, "com.example.fileprovider", photoFile)

我不太确定它是否肯定是这条线,但我运行了调试器,它似乎在这里崩溃了。

完整片段如下:

       cameraButton.setOnClickListener {
            val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
            photoFile = getPhotoFile(FILE_NAME)

            try{
                val fileProvider = FileProvider.getUriForFile(this, "com.example.fileprovider", photoFile)
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileProvider)
                if(takePictureIntent.resolveActivity(this.packageManager) != null){
                    startActivityForResult(takePictureIntent, 123)
                } else {
                    Toast.makeText(this, "Unable to open camera.", Toast.LENGTH_SHORT).show()
                }
            } catch (someException:Error){
                Toast.makeText(this, someException.toString(), Toast.LENGTH_SHORT).show()
            }
        }

    private fun getPhotoFile(fileName: String): File {
        val storageDirectory = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return File.createTempFile(fileName, ".jpg", storageDirectory)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if(requestCode == 123 && resultCode == Activity.RESULT_OK){
            //val takenImage = data?.extras?.get("data") as Bitmap
            val takenImage = BitmapFactory.decodeFile(photoFile.absolutePath)
            iv_cam.setImageBitmap(takenImage)
        } else {
            super.onActivityResult(requestCode, resultCode, data)
        }
    }

安卓清单:

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

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

    <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">
        <activity android:name="com.example.tubinginfieldinspectiontool.MainActivity"
            android:windowSoftInputMode="stateVisible|adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider
            android:authorities="com.example.fileprovider"
            android:name="androidx.core.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/path">
            </meta-data>
        </provider>
    </application>
</manifest>

路径.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name = "my_images"
        path = "Pictures">
    </external-path>
</paths>

堆栈跟踪:

2020-06-14 13:24:30.661 26865-26865/com.example.tubinginfieldinspectiontool E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.tubinginfieldinspectiontool, PID: 26865
    java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.tubinginfieldinspectiontool/files/Pictures/photo6352906109530684106.jpg
        at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:744)
        at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418)
        at com.example.tubinginfieldinspectiontool.MainActivity$onCreate$3.onClick(MainActivity.kt:68)
        at android.view.View.performClick(View.java:7357)
        at android.widget.TextView.performClick(TextView.java:14210)
        at android.view.View.performClickInternal(View.java:7323)
        at android.view.View.access$3200(View.java:849)
        at android.view.View$PerformClick.run(View.java:27884)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7266)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

标签: android-studiokotlinandroid-fileprovider

解决方案


推荐阅读