目前设想的是,通过调用手机自带的相机拍摄照片,然后返回界面,然后存储进入数据库,最后读取出来。
对于数据库存储图片的方式,我的解释,选择目前我最需要的一种方式:BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
布局界面就是一个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;
}
}
}
参考文献的话,我也不知道一共看了多少篇的,就目前的话,只有这些:
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天,因为其他事情,实际的有效时间,可能只有一天左右,也许不到,从设想出发,了解相关的理念,决定方式,然后最后实现出来。总结一句话,书到用时方恨少。
从目前来看,读取照片的设置不是很合理,也就说,读取的时候,只能是最早的一张的照片,而不是最新的,等待优化,考虑用列表展示,比这里的Imageview展示,应该会好很多。