Android Camera Intent 在 OnePlus 设备中不起作用
Android Camera Intent not working in OnePlus devices
我试图使用 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>
...
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
...
</manifest>
当我在 android 设备 (Realme 6 Pro) 上 运行 这个应用程序并点击按钮时:
- The app opens the native camera app
- I can capture the image
- The image is saved to the location where it was specified
但是当在 OnePlus 设备(在我们的例子中是 OnePlus Nord)上部署同一个应用程序并点击按钮时,没有任何反应。感觉按钮没有编程。
此代码取自此处:https://developer.android.com/training/camera/photobasics
如果有人帮助,那将是非常有帮助的。
检查 AndroidManifest.xml 以进行后续更改
<manifest ... >
<uses-feature android:name="android.hardware.camera"
android:required="true" />
...
</manifest>
确保在打开相机之前征得相机许可。
尝试询问 运行 时间权限。
免责声明:本人不善解释
按照@CommonsWare的建议,我就是这么做的。
我基本上避免使用 resolveActivity()
并以我自己的风格来做,而不是从 官方 Google 文档 [=14 中复制粘贴=]
这是我对相机应用的最后呼吁:
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
在 Oneplus nord 等更高版本的设备中,android 11 或 12 相机意图不起作用我添加了这段代码,它对我有用
在AndroidManifest.xml
中添加这一行
<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
并添加相机所需的其他权限
我试图使用 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>
...
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
...
</manifest>
当我在 android 设备 (Realme 6 Pro) 上 运行 这个应用程序并点击按钮时:
- The app opens the native camera app
- I can capture the image
- The image is saved to the location where it was specified
但是当在 OnePlus 设备(在我们的例子中是 OnePlus Nord)上部署同一个应用程序并点击按钮时,没有任何反应。感觉按钮没有编程。
此代码取自此处:https://developer.android.com/training/camera/photobasics
如果有人帮助,那将是非常有帮助的。
检查 AndroidManifest.xml 以进行后续更改
<manifest ... >
<uses-feature android:name="android.hardware.camera"
android:required="true" />
...
</manifest>
确保在打开相机之前征得相机许可。
尝试询问 运行 时间权限。
免责声明:本人不善解释
按照@CommonsWare的建议,我就是这么做的。
我基本上避免使用 resolveActivity()
并以我自己的风格来做,而不是从 官方 Google 文档 [=14 中复制粘贴=]
这是我对相机应用的最后呼吁:
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
在 Oneplus nord 等更高版本的设备中,android 11 或 12 相机意图不起作用我添加了这段代码,它对我有用
在AndroidManifest.xml
中添加这一行<queries>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
</queries>
并添加相机所需的其他权限