Android学习之调用相机拍摄,并存储到sqllite数据库中,

文章目录

  • 1、实现功能
  • 2、相关代码
  • 3、实现效果
  • 4、参考文献
  • 5、存在问题

1、实现功能

目前设想的是,通过调用手机自带的相机拍摄照片,然后返回界面,然后存储进入数据库,最后读取出来。
对于数据库存储图片的方式,我的解释,选择目前我最需要的一种方式:BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

2、相关代码

布局界面就是一个xml文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:layout_editor_absoluteY="25dp">


    <ImageView
        android:id="@+id/iv_pic"
        android:layout_width="231dp"
        android:layout_height="223dp"
        android:layout_marginStart="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn_4"
        app:layout_constraintVertical_bias="0.109" />

    <ImageView
        android:id="@+id/iv_pic1"
        android:layout_width="231dp"
        android:layout_height="223dp"
        android:layout_marginStart="136dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn_4"
        app:layout_constraintVertical_bias="0.929" />


    <Button
        android:id="@+id/btn_4"
        android:layout_width="90dp"
        android:layout_height="44dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:text="相机"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn_5"
        android:layout_width="90dp"
        android:layout_height="44dp"
        android:layout_marginStart="136dp"
        android:layout_marginTop="16dp"
        android:text="读取"
        app:layout_constraintStart_toEndOf="@+id/btn_4"
        app:layout_constraintTop_toTopOf="parent" />




</android.support.constraint.ConstraintLayout>

数据库部分:MySqlLite

package com.example.wuluo.uidesigen;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by wuluo on 2020/4/11
 */
public class MySqlLite extends SQLiteOpenHelper {

    public MySqlLite(Context context, int version) {
        //指明上下文,数据库名,工厂默认空值,版本号默认从1开始
        super(context, "panzou.db", null, version);
    }
    //数据库文件创建成功后调用,
    @Override
    public void onCreate(SQLiteDatabase db) {
        System.out.println("数据库创建");

        //图片存储表
        db.execSQL("create table test(\n" +
                "id integer primary key  autoincrement,\n" +
                "name varchar(50),\n" +
                "vatar blob \n" +
                ");");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        System.out.println("数据库更新");
    }
}

变量申明部分:Test

package com.example.wuluo.uidesigen;

import android.graphics.Bitmap;

import java.io.Serializable;
import java.sql.Blob;

/**
 * Created by wuluo on 2020/4/11
 */
public class Test implements Serializable {
    //id
    private  int tid;
    //部件号
    private String tname;
    //部件名称
    private byte[] tvatar;
    //病害位置
    public Test(int id,String name,byte[] vatar){
        tid=id;
        tname=name;
       tvatar=vatar;
    }

    public Test(byte[] vatar){
        tvatar=vatar;
    }


    public int getTid() {
        return tid;
    }
    public void setTid(int tid) {
        this.tid = tid;
    }
    public String getTname() {
        return tname;
    }
    public void setTname(String tname) {
        this.tname = tname;
    }

    public byte[] getTvatar() {
        return tvatar;
    }

    public void setTvatar(byte[] tvatar) {
        this.tvatar = tvatar;
    }
}

对表的操作:Testdbop

package com.example.wuluo.uidesigen;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by wuluo on 2020/4/11
 */
public class Testdbop {
    private MySqlLite mySqlLite;
    private SQLiteDatabase database;
    public void test(Context context) {
        mySqlLite = new MySqlLite(context, 3);
        database = mySqlLite.getReadableDatabase();
    }
    //插入
    public void insert(Test s){
        database.execSQL("insert into test values(?,?,?" + ")",new Object[] {null,null,s.getTvatar()});
        System.out.println("插入数据成功");
    }
    //删除
    public void delete(int id){

    }
    //更新
    public void updata(){

    }
    //查找
    public byte[] readImage(){

        Cursor cur = database.rawQuery("select * from test", null);
        byte[] imgData=null;
        if(cur.moveToNext()){
            //将Blob数据转化为字节数组
            imgData=cur.getBlob(cur.getColumnIndex("vatar"));
        }
        return imgData;
    }

    public List<Test> getAll(){
        List<Test> list = new ArrayList<Test>();
       
        Cursor cur = database.rawQuery("select * from test", null);
        byte[] imgData=null;
        if(cur.moveToNext()){
            //将Blob数据转化为字节数组
            imgData=cur.getBlob(cur.getColumnIndex("vatar"));
            list.add(new Test(imgData));
        }
        return list;
    }
   
    
      
    
   

}

主函数部分:Main8Activity

package com.example.wuluo.uidesigen;

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.sql.Blob;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by wuluo on 2020/4/11
 */
public class Main8Activity extends AppCompatActivity implements OnClickListener{
    // private EditText et_2;
    private ImageView iv_pic;
    private ImageView iv_pic1;
    private Button btn_4;//相机
    private Button btn_5;//地图
    private String url;
    private DBOperate dbOperate;

    Testdbop dbop=new Testdbop();
    ArrayList<Test> binfo1list= new ArrayList<Test>();
    MySqlLite mySqlLite = new MySqlLite(Main8Activity.this, 1);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main7);

        iv_pic = findViewById(R.id.iv_pic);
        iv_pic1 = findViewById(R.id.iv_pic1);
        btn_4 = (Button) findViewById(R.id.btn_4);
        btn_4.setOnClickListener(this);
        btn_5 = (Button) findViewById(R.id.btn_5);
        btn_5.setOnClickListener(this);

        dbop.test(this);

    }

    @Override
    public void onClick(View view) {
        Intent intent = new Intent();
        switch (view.getId()){
            case  R.id.btn_4 :
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //设置动作为调用照相机
                startActivityForResult(intent, 3);//REQUEST_CAMERA请求码
                //saveImage(url);
                break;
            case  R.id.btn_5 :
                //相机
               // readImage();
               // dbop.searchall();
                System.out.println("开始读取");
                byte[] imgData=dbop.readImage();
                System.out.println("准备显示");
                if (imgData!=null) {
                    //将字节数组转化为位图
                    Bitmap imagebitmap = BitmapFactory.decodeByteArray(imgData, 0, imgData.length);
                    //将位图显示为图片
                    iv_pic1.setImageBitmap(imagebitmap);
                    System.out.println("显示成功");
                }else {
                    iv_pic1.setBackgroundResource(android.R.drawable.menuitem_background);
                }
                break;

        }

    }
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Bundle bundle = data.getExtras();
        if (data == null)
            return;
        super.onActivityResult(requestCode, resultCode, data);
        //Bundle bundle = data.getExtras();// 从data中取出传递回来的数据
        System.out.println("开始拍照");
        switch (requestCode) {
            case 0:
                break;
            case 3:
                Bitmap bitmap = (Bitmap) bundle.get("data");//// 将data中的信息流解析为Bitmap类型
                iv_pic.setImageBitmap(bitmap);// 显示图片
                System.out.println("拍照成功");
                //将图片转化为位图
                int size = bitmap.getWidth() * bitmap.getHeight() * 4;
                //int size = 20 * 30 * 4;
                //创建一个字节数组输出流,流的大小为size

                ByteArrayOutputStream baos= new ByteArrayOutputStream(size);
                try {
                    //设置位图的压缩格式,质量为100%,并放入字节数组输出流中
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
                    //将字节数组输出流转化为字节数组byte[]
                    byte[] imagedata = baos.toByteArray();
                    Test d=new Test(imagedata);
                    dbop.insert(d);
                    //return imagedata;
                }catch (Exception e){
                }finally {
                    try {
                        //bitmap.recycle();
                        baos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

              

                
                break;
            default:
                break;
        }
    }


}

3、实现效果

Android学习之调用相机拍摄,并存储到sqllite数据库中,_第1张图片
Android学习之调用相机拍摄,并存储到sqllite数据库中,_第2张图片
Android学习之调用相机拍摄,并存储到sqllite数据库中,_第3张图片
顺便说一下,以后尽量上传GIF吧,图片的展示效果不佳。

4、参考文献

参考文献的话,我也不知道一共看了多少篇的,就目前的话,只有这些:
https://blog.csdn.net/qq_43433255/article/details/88374889
https://www.cnblogs.com/wxmdevelop/p/6180424.html
https://www.cnblogs.com/xiang1992/p/3428295.html
https://blog.csdn.net/CrazyMo_/article/details/54344554?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2
其他的参考,找不到了,但是目前的参考文献,也能做出来了。

5、存在问题

因为这个东西,前前后后弄了5天,因为其他事情,实际的有效时间,可能只有一天左右,也许不到,从设想出发,了解相关的理念,决定方式,然后最后实现出来。总结一句话,书到用时方恨少。
从目前来看,读取照片的设置不是很合理,也就说,读取的时候,只能是最早的一张的照片,而不是最新的,等待优化,考虑用列表展示,比这里的Imageview展示,应该会好很多。

你可能感兴趣的:(Android,wuluo)