我试图使用Android设备预装的本机相机应用程序来为我的应用程序捕获图像。为此,我一直使用以下代码:
当用户点击按钮
时调用一个函数take_img_btn.setOnClickListener {
dispatchTakePictureIntent()
}
该函数应该这样做:
private fun dispatchTakePictureIntent() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
// Ensure that there's a camera activity to handle the intent
takePictureIntent.resolveActivity(packageManager)?.also {
// Create the File where the photo should go
val photoFile: File? = try {
createImageFile()
} catch (ex: IOException) {
// Error occurred while creating the File
ex.printStackTrace()
null
}
// Continue only if the File was successfully created
photoFile?.also {
val photoURI: Uri = FileProvider.getUriForFile(
this,
"com.example.android.fileprovider",
it
)
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
}
}
}
}
private fun createImageFile(): File {
// Create an image file name
val timeStamp: String = SimpleDateFormat("yy-MM-dd-HH-mm-ss-SS",Locale.getDefault()).format(System.currentTimeMillis())
val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return File.createTempFile(
"FNL_${timeStamp}_",
".jpg",
storageDir /* directory */
).apply {
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = absolutePath
currentPhotoName = name
}
}
FileProvider在Manifest中配置如下
<application>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.android.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
...
</application>
我也要求相机功能在Manifest
<manifest>
...
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
...
</manifest>
当我运行这个应用程序在我的安卓设备(Realme 6 Pro),然后点击按钮:
- 应用程序打开本机相机应用程序
我可以捕获图像- 图像被保存到指定的位置
但是当同样的应用程序部署在一加设备上(在我们的例子中是一加Nord)并点击按钮时,什么也没有发生。感觉好像这个按钮没编程序。
这段代码取自这里:https://developer.android.com/training/camera/photobasics
如果有人来帮忙就太好了。
免责声明:我不擅长解释
按照@CommonsWare的建议,我是这样做的。
我基本上避免使用resolveActivity()
,用我自己的风格来做,而不是从官方谷歌文档复制粘贴。
这是我对相机应用的最后一次呼吁:
private fun dispatchTakePictureIntent() {
val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
val photoFile: File? = try {
createImageFile()
} catch (ex: IOException) {
// Error occurred while creating the File
ex.printStackTrace()
null
}
if (photoFile != null){
val photoURI: Uri = FileProvider.getUriForFile(
this,
"com.example.android.fileprovider",
photoFile
)
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE)
}
}
private fun createImageFile(): File {
// Create an image file name
val timeStamp: String = SimpleDateFormat("yy-MM-dd-HH-mm-ss-SS",Locale.getDefault()).format(System.currentTimeMillis())
val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return File.createTempFile(
"FNL_${timeStamp}_",
".jpg",
storageDir /* directory */
).apply {
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = absolutePath
currentPhotoName = name
}
}
最后,非常感谢@CommonsWare
在更高版本的设备,如一加nord与android 11或12相机意图不工作,我添加了这个代码,它是为我工作
在AndroidManifest.xml中添加这行
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
并添加相机所需的其他权限