借鉴下述文章,用Kotlin语言实现了在安卓工程中打开图片和拍摄图片。
https://baijiahao.baidu.com/s?id=1570795535558971&wfr=spider&for=pc
—————————————————————————————————
具体实现过程和代码如下:
- 首先进入到XX.xml文件中(如果你是自己新建的XXactivity,那么对应的布局文件就是XXactivity.xml,否则就是mainActivity对应的activity_main.xml)。
· 新建两个Button控件,按钮文案分别写“打开图片”和“拍摄图片”。按钮的id分别为:btn_openimage和btn_camera。
· 新建一个ImageView控件,作为显示图片的控件,id命名为show_image。
安卓工程开发基础知识不了解的同学可以看 天哥在奔跑 的B站视频,讲的非常好,可是用的是java不是kotlin,有些代码还是要自己百度修改。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity"
android:id="@+id/parent_layout">
<RelativeLayout
android:id="@+id/re_1"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button1
android:id="@+id/btn_openimage"
android:layout_width="150dp"
android:layout_height="50dp"
android:text="打开图片"
android:textSize="18sp"
android:layout_alignParentBottom="true"
android:layout_margin="10dp"/>
<Button1
android:id="@+id/btn_camera"
android:layout_width="150dp"
android:layout_height="50dp"
android:text="拍摄图片"
android:textSize="18sp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_margin="10dp"/>
<ImageView
android:id="@+id/show_image"
android:layout_width="match_parent"
android:layout_height="200dp"
android:src="@drawable/annuun"
android:layout_margin="15dp"
android:background="#000"
/>
</RelativeLayout>
</RelativeLayout>
- 然后转到相应的activity文件中写实现代码
需要自行写的函数有三个,一个是click函数,一个是onActivityResult函数,还有一个是savePicToSdCard函数。
这三个函数都写在主class里面,override fun onCreate外面。
然后调用的语句,写在override fun onCreate里面。
三个函数是根据这个网址得到的,非常有用。
https://baijiahao.baidu.com/s?id=1570795535558971&wfr=spider&for=pc
fun click(view:View){
when(view.id){
R.id.btn_camera -> { // 相应按钮事件,调用系统相机
val loadCameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if(loadCameraIntent.resolveActivity(packageManager) != null){
startActivityForResult(loadCameraIntent, CAMERA_REQUEST_CODE)
}
}
R.id.btn_openimage -> { //打开图片
val selectPicIntent = Intent()
selectPicIntent.type = "image/*"
selectPicIntent.action = Intent.ACTION_GET_CONTENT
if(selectPicIntent.resolveActivity(packageManager)!=null){
startActivityForResult(Intent.createChooser(selectPicIntent,"select a picture"), SELPIC_REQUEST_CODE)
}
}
}
}
.
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode){
CAMERA_REQUEST_CODE -> { //相机
if(resultCode == Activity.RESULT_OK && data != null){
val picBitmap:Bitmap = data.extras.get("data") as Bitmap
show_image.setImageBitmap(picBitmap) //显示图片
savePicToSdCard(picBitmap) //这个函数可以以后再写 看云笔记的2018.8.2
}
}
SELPIC_REQUEST_CODE -> {
if(resultCode == Activity.RESULT_OK && data != null){
val uri:Uri? = data.data
if(uri != null){
var instream:InputStream? = null
try{
instream = contentResolver.openInputStream(uri)
val selPicBitmap : Bitmap = BitmapFactory.decodeStream(instream)
show_image.setImageBitmap(selPicBitmap)
}catch (e : Exception){
Toast.makeText(this, e.message, Toast.LENGTH_SHORT).show()
}finally {
// finally 不知道写什么
}
}
}
}
}
}
.
fun savePicToSdCard(picBitmap: Bitmap?){
val sdStatus = Environment.getExternalStorageState()
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(this, "SDcard is not ready yet", Toast.LENGTH_SHORT).show()
return
}
var fos:FileOutputStream? = null
try {
val fileDir = Environment.getExternalStorageDirectory().absolutePath + "/ATest/"
val file: File = File(fileDir)
if (!file.exists()) {
file.mkdirs()
}
fos = FileOutputStream(fileDir + UUID.randomUUID() + ".jpg")
if (picBitmap != null) {
picBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
fos.flush()
}
}
catch (e:Exception){
Toast.makeText(this, e.message,Toast.LENGTH_SHORT).show()
}finally {
fos?.flush()
}
}
}
调用语句如下:
btn_camera.setOnClickListener(){
click(btn_camera)
}
btn_openimage.setOnClickListener(){
click(btn_openimage)
}