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呼叫攝像頭Android
- 安卓開發之呼叫攝像頭安卓
- Android呼叫攝像頭拍照Android
- Android 呼叫攝像頭拍照Android
- Android如何呼叫攝像頭Android
- 瀏覽器呼叫攝像頭進行拍照程式瀏覽器
- 攝像頭黑屏怎麼辦 各種攝像頭不能用的解決方法
- android 開啟攝像頭Android
- 照片系列之android呼叫攝像頭拍照Android
- 安卓呼叫攝像頭拍照安卓
- android studio呼叫攝像頭拍照及具體步驟演示程式碼Android
- Android呼叫攝像頭拍照並顯示照片Android
- Android 呼叫攝像頭功能【拍照與視訊】Android
- jQuery webcam plugin呼叫攝像頭jQueryWebPlugin
- 解決win7攝像頭影像倒立的方法Win7
- 攝像頭不能用怎麼辦 攝像頭不能用解決辦法
- html5呼叫攝像頭功能HTML
- Win10怎麼開啟攝像頭 win10開啟攝像頭的方法Win10
- Android 12 “致命”崩潰解決之路Android
- 如何利用html5呼叫手機攝像頭程式碼例項HTML
- android opencv 前置攝像頭AndroidOpenCV
- 修正Android攝像頭APIAndroidAPI
- 簡單介紹C#呼叫USB攝像頭的方法C#
- html5呼叫攝像頭截圖HTML
- 教你如何利用python呼叫攝像頭Python
- html5呼叫手機攝像頭HTML
- C#實現攝像頭呼叫、拍照C#
- win10微信影片無法使用攝像頭怎麼辦 win10電腦微信打不開攝像頭解決方法Win10
- Android7.1.1Toast崩潰解決方案AndroidAST
- Android多媒體應用開發-控制攝像頭拍照Android
- windows10攝像頭怎麼開啟_window10怎麼開啟攝像頭的方法Windows
- 在Android中呼叫攝像頭拍照並顯示出來Android
- Android CameraX 開啟攝像頭預覽Android
- 搭建一個攝像頭應用程式 應用程式內部攝像頭
- win10微信視訊無法使用攝像頭怎麼辦 win10電腦微信打不開攝像頭解決方法Win10
- [解決] Goland 開啟後直接崩潰GoLand
- Win10專業版攝像頭在哪裡開啟 windows10攝像頭開啟的方法Win10Windows