I followed this youtube tutorial to add a camera button to my app but the app seems to crash when it gets to
val fileProvider = FileProvider.getUriForFile(this, "com.example.fileprovider", photoFile)
I'm not very sure if it's definately this line but I ran the debugger and it seems to crash here.
Full snippet below:
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)
}
}
AndroidManifest:
<?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>
Path.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name = "my_images"
path = "Pictures">
</external-path>
</paths>
Stack Trace:
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)