android-studio - 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)
解决方案
推荐阅读
- python - 如何从 SMILES 分子表示中生成图形?
- python - 如何替换文本文件中的值?
- java - 如果将 Spring 5.X 的 DefaultCookieSerializer 与 Tomcat 8 一起使用,如何防止创建 JSESSIONID
- sql - 编写 SQL 查询
- java - 在 WebView 中启用 JavaScript 后,Recaptcha 无法正常工作
- php - 如何在 PHP 中将数字 621 向上舍入到 700?
- javascript - 识别、读取和写入目录中的多个文本文件时出错 ENOENT 错误
- three.js - A-Frame:几何缓存/从 GLTF 注册新几何
- python - 如何检查字符串是否有任何特殊字符?
- reactjs - 使用 TypeScript 在 CRA 中提取 i18n 消息