as 拍照取照片

大赵传奇 / 2024-10-09 / 原文

拍照

先要有一个outputImage, 新建一个,用于存储拍的照片。再取到这个uri,  再intent,   android.media.action.IMAGE_CAPTURE,putExtra到uri上。然后在OnActiveResult里when 一下,就找到返回 RESULT_OK,BitmapFactory.decodeStream取到 bitmap,显示出来。

 

 从相册取照片,也是intent , Intent.ACTION_OPEN_DOCUMENT, addCatagory(Intent.CATEGORY_OPENABLE), type="image/*",然后从OnActiveResult里取。见上

 

  1 package com.example.myapplication
  2 
  3 import android.app.Activity
  4 import android.content.Intent
  5 import android.graphics.Bitmap
  6 import android.graphics.BitmapFactory
  7 import android.graphics.Matrix
  8 import android.media.ExifInterface
  9 import android.media.Image
 10 import android.net.Uri
 11 import android.os.Build
 12 import android.os.Bundle
 13 import android.provider.MediaStore
 14 import android.widget.Button
 15 import android.widget.ImageView
 16 import androidx.appcompat.app.AppCompatActivity
 17 import androidx.core.content.FileProvider
 18 import java.io.File
 19 
 20 
 21 class MainActivity2222 : AppCompatActivity() {
 22 
 23     private lateinit var imageview: ImageView
 24     val takePhoto = 1
 25     lateinit var imageUrl:Uri
 26     lateinit var outputImage:File
 27 
 28     var fromAlbum = 2
 29 
 30     override fun onCreate(savedInstanceState: Bundle?) {
 31         super.onCreate(savedInstanceState)
 32         //enableEdgeToEdge()
 33         setContentView(R.layout.activity_main2222)
 34 
 35 //        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
 36 //            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
 37 //            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
 38 //            insets
 39 //        }
 40 
 41 
 42 
 43 //        val list= listOf("b","c","d","e","f","a")
 44 //        val result  = with(StringBuilder()){
 45 //            append("Start eating fruits.\n")
 46 //            for (fruit in list){
 47 //                append(fruit).append("\n")
 48 //            }
 49 //            append("end.")
 50 //            toString()
 51 //        }
 52 //        println(result)
 53 
 54         val sb = StringBuilder()
 55         val tt = sb.run{
 56             append(".aa").append(",")
 57             99
 58         }
 59         println(tt)
 60 
 61 //        val sb = StringBuilder().apply {
 62 //            append("Hello.")
 63 //            append(",")
 64 //        }
 65 //        println(sb)
 66 
 67 
 68         imageview = findViewById<ImageView>(R.id.imageView1)
 69         var btn1 = findViewById<Button>(R.id.button1)
 70         var btnOpen = findViewById<Button>(R.id.btnOpenAlbum)
 71         btnOpen.setOnClickListener{
 72 
 73             val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
 74             intent.addCategory(Intent.CATEGORY_OPENABLE)
 75             intent.type = "image/*"
 76             startActivityForResult(intent, fromAlbum)
 77         }
 78 
 79 
 80         btn1.setOnClickListener(){
 81 
 82             outputImage = File(externalCacheDir, "output_image.jpg")
 83             if(outputImage.exists()){
 84                 outputImage.delete()
 85             }
 86             outputImage.createNewFile()
 87 
 88             //因为从android 7系统开始,直接使用本地真实路径的Uri被认为是不安全的,
 89             //可以选择性地将封装过Uri 共享给外部,从而提高了应用的安全性
 90 //            imageUrl = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
 91 //                FileProvider.getUriForFile(this, "com.example.myapplication.fileprovider",outputImage)
 92 //            }else{
 93 //                Uri.fromFile(outputImage)
 94 //            }
 95 
 96             imageUrl = FileProvider.getUriForFile(this, "com.example.myapplication.fileprovider",outputImage)
 97 
 98             val intent = Intent("android.media.action.IMAGE_CAPTURE")
 99             intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUrl)
100             startActivityForResult(intent,takePhoto)
101 
102 
103 //            var intent = Intent(this, DateActivity::class.java)
104 //            startActivity(intent)
105 
106 //            var intent2 = Intent("com.example55.myapplication55.TEST55")
107 //            intent2.addCategory("android.intent.category.DEFAULT55")
108 //            startActivity(intent2)
109 
110 //            val uri = Uri.parse("tel:10086") //拨号程序
111 //            val intent = Intent(Intent.ACTION_VIEW, uri)
112 //            startActivity(intent);
113 
114 //            val uri = Uri.parse("geo:39.899533,116.036476")
115 //            val intent = Intent(Intent.ACTION_VIEW, uri)
116 //            startActivity(intent)
117 
118             //通过包名启动--无效
119 //            val launchIntent = packageManager.getLaunchIntentForPackage("com.android.chrome")
120 //            startActivity(launchIntent)
121 
122 
123 
124 //            val pm = packageManager
125 //            //var isChromeInstalled: Boolean
126 //            try {
127 //                pm.getPackageInfo("com.android.chrome", PackageManager.GET_ACTIVITIES)
128 //
129 //                val intent = Intent(Intent.ACTION_VIEW)
130 //                intent.setData(Uri.parse("www.baidu.com"))
131 //                intent.setPackage("com.android.chrome") // 指定 Chrome 包名
132 //                startActivity(intent)
133 //
134 //            } catch (e: PackageManager.NameNotFoundException) {
135 //                Toast.makeText(this,"未安装chrome", Toast.LENGTH_LONG).show()
136 //            }
137 
138 
139 //            val uri =
140 //                Uri.parse("https://www.csdn.net/")
141 //            try {
142 //                val intent = Intent(Intent.ACTION_VIEW, uri)
143 //                //指定谷歌浏览器
144 //                intent.setClassName("com.android.chrome", "com.google.android.apps.chrome.Main")
145 //                startActivity(intent)
146 //            } catch (e: Exception) {
147 //                val intent = Intent(Intent.ACTION_VIEW, uri)
148 //                startActivity(intent)
149 //            }
150 
151 
152         }
153 
154 
155     }
156 
157 
158     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
159         super.onActivityResult(requestCode, resultCode, data)
160         when(requestCode){
161             takePhoto->{
162                 if(resultCode == Activity.RESULT_OK){
163                     val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(imageUrl))
164                     imageview.setImageBitmap(rotateIfRequired(bitmap))
165                 }
166             }
167             fromAlbum->{
168                 if(resultCode == Activity.RESULT_OK && data != null){
169                     data.data?.let { uri->
170                         //将选择的图片
171                         val bitmap = getBitmapFromUri(uri)
172                         imageview.setImageBitmap(bitmap)
173                     }
174                 }
175             }
176         }
177     }
178     private fun getBitmapFromUri(uri: Uri) = contentResolver
179         .openFileDescriptor(uri, "r")?.use {
180             BitmapFactory.decodeFileDescriptor((it.fileDescriptor))
181         }
182 
183     private fun rotateIfRequired(bitmap: Bitmap):Bitmap{
184         val exif = ExifInterface(outputImage.path)
185         val orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
186         return when(orientation){
187             ExifInterface.ORIENTATION_ROTATE_90 -> rotateBitmap(bitmap, 90)
188             ExifInterface.ORIENTATION_ROTATE_180 -> rotateBitmap(bitmap, 180)
189             ExifInterface.ORIENTATION_ROTATE_270 -> rotateBitmap(bitmap, 270)
190             else->bitmap
191         }
192     }
193     private fun rotateBitmap(bitmap: Bitmap, degree:Int):Bitmap{
194         val matrix = Matrix()
195         matrix.postRotate(degree.toFloat())
196         val rotateBitmap = Bitmap.createBitmap(bitmap, 0,0,bitmap.width,bitmap.height,matrix, true)
197         bitmap.recycle()
198         return rotateBitmap
199     }
200 
201 
202 
203 }
204 class People(name:String, age:Int){}
View Code