美文网首页
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

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