美文网首页
2018-08-02

2018-08-02

作者: 花花草草狗狗猫猫 | 来源:发表于2018-08-02 19:34 被阅读0次

借鉴下述文章,用Kotlin语言实现了在安卓工程中打开图片和拍摄图片。
https://baijiahao.baidu.com/s?id=1570795535558971&wfr=spider&for=pc
—————————————————————————————————
具体实现过程和代码如下:

  1. 首先进入到XX.xml文件中(如果你是自己新建的XXactivity,那么对应的布局文件就是XXactivity.xml,否则就是mainActivity对应的activity_main.xml)。

· 新建两个Button控件,按钮文案分别写“打开图片”和“拍摄图片”。按钮的id分别为:btn_openimage和btn_camera。

· 新建一个ImageView控件,作为显示图片的控件,id命名为show_image。

安卓工程开发基础知识不了解的同学可以看 天哥在奔跑 的B站视频,讲的非常好,可是用的是java不是kotlin,有些代码还是要自己百度修改。


捕获1.JPG
<?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>
  1. 然后转到相应的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)
    }

相关文章

  • 2018-08-02

    2018-08-02

  • 2018-08-13

    2018-08-02 梁新平 2018-08-02 21:26 · 字数 617 · 阅读 0 · 日记本 【月度...

  • 2018-08-02

    2018-08-02 哈利波特二代 2018-08-02 10:32 · 字数 259 · 阅读 0 · 日记本 ...

  • 用户层~内核层通信(netlink 内核层)

    layout: posttitle: netlink通信机制-内核层date: 2018-08-02 02:01:...

  • 国际冠军杯|阿森纳 VS 切尔西

    国际冠军杯/吉尼斯杯 比赛时间:2018-08-02 星期四 03:00 欧洲指数:2.84 3.90 2.27 ...

  • 忆梅☕️玉露

    小径银珠弹,裙裾芳馥染。田田迎清风,换作茶一盏。 忆梅2018-08-02

  • 读懂芯片IC的datasheet

    读懂datasheet 2018-08-02 做电子设计,难免要读datasheet,而优质的中文版可遇不可求,...

  • 2018-08-02

    2018-08-02 f红艳 事件:今天和儿子讨论十二条快乐软件,关于界限与底线。 感受:失望,惊讶,平静。 想法...

  • 欧冠杯:格拉茨风暴 VS 阿贾克斯

    欧冠杯竞彩 比赛时间:2018-08-02 星期四 02:30 欧洲指数:3.70 3.65 1.90 亚洲初数:...

  • 20180930

    往后余生,我想以自己喜欢的方式度过 流浪摄影师 关注 2018-08-02 13:33 · 字数 1127 · 阅...

网友评论

      本文标题:2018-08-02

      本文链接:https://www.haomeiwen.com/subject/arwsvftx.html