请帮助我解决问题。我的应用程序允许拍照并保存在私人文件夹中。下面,我描述了已完成的步骤(根据官方文档)。
我在AndroidManifest.xml中添加了权限和提供程序
<manifest ...>
<uses-premission andoird:name="andoird.permission.WRITE_EXTERNAL_STORAGE" />
...
<application ...>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.company.appname.fileprovider"
...>
<meta-data
android:name="andoird.support.FILE_PROVIDER_PATHS"
andoird:resource="@xml/file_paths" />
</provider>
...
</application>
</manifest>
在file_path.xml中,我添加了必填路径
<paths>
<external-path
name="my_images"
path="Android/data/com.company.appname/file/Pictures" />
</paths>
然后我在请求摄影机许可(kotlin)后运行cameraIntent
fun cameraIntent() {
var intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if (intent.resolveActivity(packecgeManager) != null) {
val prefix = System.currentTimeMillis().toString()
var suffix = ".jpg"
val folder = getExternalFilesDir(Environment.DIRECTORY_PICTURES) // (1)
var file = File.createTempFile(prefix, suffix, folder) // (2)
var uri = FileProvider.getUriForFile(this, "com.company.appname.fileprovider", file) // (1.1)
...
}
}
最后是问题描述。
(1)该代码有时返回file_path.xml中设置的路径
/storage/emulated/0/Android/data/com.company.appname/file/Pictures/1534529847360260979036.jpg
但有时(Lenovo A6010 / Android 5.0.2 / API 21)
/storage/emulated/0/Android/data/com.company.appname/cache/1534529847360260979036.jpg
(1.1)作为(1)的结果,当结果路径指向“缓存”时,此行代码将引发异常
java.lang.IllegalArgumentException
Failed to find configured root that contains /data/data/com.company.appname/cache/1534529847360260979036.jpg
因为未在file_path中设置此路径,但是为什么(1)返回此路径?
(2)这行代码有时也会引发异常(HUAWEI ShotX / 5.1.1 / API 22)
java.io.IOException
open failed: EACCES (Permission denied)
为什么?
PS:我的应用程序的minSdkVersion为21。
答案 0 :(得分:0)
我通过以下方式更改生成的路径
var folder = getExternalFilesDir(null)
if (folder.path.endsWith("cache")) {
folder = File(folder.path.replace("cache", "files"))
}
if (!folder.exists()) {
folder.mkdir()
}
folder = File(folder.path + File.separator + "Pictures")
if (!folder.exists()) {
folder.mkdir()
}
val file = File.createTempFile(prefix, suffix, folder)
...
我认为这是一个丑陋的解决方案,但我没有其他想法。