Android開發,《第一行程式碼(第三版)》呼叫攝像頭崩潰解決方法
最近在學習安卓,到呼叫攝像頭這裡的時候寫出來程式一直崩潰,人都給整崩潰了,通過查閱資料以及看前面的章節,這是因為沒有動態申請許可權的原因,改正如下:
首先AndroidManifest.xml裡宣告一下許可權:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.cameraalbumtest">
<uses-permission android:name="android.permission.CAMERA"/>
<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=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.cameraalbumtest.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
</application>
</manifest>
然後MainActivity這樣寫:
package com.example.cameraalbumtest
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.media.ExifInterface
import android.net.Uri
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import kotlinx.android.synthetic.main.activity_main.*
import java.io.File
class MainActivity : AppCompatActivity() {
val takePhoto = 1
lateinit var imageUri: Uri
lateinit var outputImage: File
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
takePhotoBtn.setOnClickListener{
if(ContextCompat.checkSelfPermission(this,
android.Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,
arrayOf(android.Manifest.permission.CAMERA),1)
}else{
camera()
}
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
when (requestCode){
1 -> {
if(grantResults.isNotEmpty() &&
grantResults[0] == PackageManager.PERMISSION_GRANTED){
camera()
}else{
Toast.makeText(this,"You denied the permission",
Toast.LENGTH_SHORT).show()
}
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode){
takePhoto -> {
if(resultCode == Activity.RESULT_OK){
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))
imageView.setImageBitmap(rotateIfRequired(bitmap))
}
}
}
}
private fun camera(){
try {
outputImage = File(externalCacheDir, "output_image.jpg")
if (outputImage.exists()){
outputImage.delete()
}
outputImage.createNewFile()
imageUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
FileProvider.getUriForFile(this, "com.example.cameraalbumtest." +
"fileprovider",outputImage)
}else{
Uri.fromFile(outputImage)
}
val intent = Intent("android.media.action.IMAGE_CAPTURE")
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)
startActivityForResult(intent, takePhoto)
}catch (e: SecurityException){
e.printStackTrace()
}
}
private fun rotateIfRequired(bitmap: Bitmap): Bitmap{
val exif = ExifInterface(outputImage.path)
val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL)
return when(orientation){
ExifInterface.ORIENTATION_ROTATE_90 -> rotateBitmap(bitmap, 90)
ExifInterface.ORIENTATION_ROTATE_180 -> rotateBitmap(bitmap, 180)
ExifInterface.ORIENTATION_ROTATE_270 -> rotateBitmap(bitmap, 270)
else -> bitmap
}
}
private fun rotateBitmap(bitmap: Bitmap, degree: Int): Bitmap {
val matrix = Matrix()
matrix.postRotate(degree.toFloat())
val rotateBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height,
matrix, true)
bitmap.recycle()
return rotateBitmap
}
}
終於能用了!!喝彩喝彩,以上我真機測試能用,我的手機是vivo iqoo,Android10
相關文章
- Android呼叫攝像頭拍照Android
- 安卓開發之呼叫攝像頭安卓
- android studio呼叫攝像頭拍照及具體步驟演示程式碼Android
- 照片系列之android呼叫攝像頭拍照Android
- android 開啟攝像頭Android
- 瀏覽器呼叫攝像頭進行拍照程式瀏覽器
- Android呼叫攝像頭拍照並顯示照片Android
- Android 12 “致命”崩潰解決之路Android
- jQuery webcam plugin呼叫攝像頭jQueryWebPlugin
- 安卓呼叫攝像頭拍照安卓
- Android7.1.1Toast崩潰解決方案AndroidAST
- android opencv 前置攝像頭AndroidOpenCV
- Android CameraX 開啟攝像頭預覽Android
- 在Android中呼叫攝像頭拍照並顯示出來Android
- html5呼叫攝像頭功能HTML
- 教你如何利用python呼叫攝像頭Python
- HTML5如何呼叫攝像頭?HTML
- Android提供的攝像頭拍照Android
- android studio之簡單呼叫攝像頭並且獲取其照片Android
- 簡單介紹C#呼叫USB攝像頭的方法C#
- html5呼叫攝像頭截圖HTML
- [譯]Android的多攝像頭支援Android
- [譯] Android 的多攝像頭支援Android
- [解決] Goland 開啟後直接崩潰GoLand
- 搭建一個攝像頭應用程式 應用程式內部攝像頭
- windows10攝像頭怎麼開啟_window10怎麼開啟攝像頭的方法Windows
- Android | 零程式碼快速整合AGC崩潰服務AndroidGC
- 絕地求生崩潰怎麼解決win10_win10絕地求生崩潰的解決方法Win10
- Win10專業版攝像頭在哪裡開啟 windows10攝像頭開啟的方法Win10Windows
- win10微信影片無法使用攝像頭怎麼辦 win10電腦微信打不開攝像頭解決方法Win10
- windows10攝像頭不能用如何解決_windows10攝像頭無法使用修復方法Windows
- Android 攝像頭預覽懸浮窗Android
- win10微信視訊無法使用攝像頭怎麼辦 win10電腦微信打不開攝像頭解決方法Win10
- [譯] 如何在 Android 開發中充分利用多攝像頭 APIAndroidAPI
- WebRTC開啟本地攝像頭Web
- Android11修改攝像頭前後置方法,觸覺智慧RK3568開發板演示Android
- Win10攝像頭如何開啟_WIN10攝像頭在哪裡Win10
- Win10攝像頭黑屏是怎麼回事_Win10攝像頭開啟黑屏如何解決Win10