【问题标题】:How to take pic with camera and save it to database and show in listView in Android?如何用相机拍照并将其保存到数据库并在 Android 的 listView 中显示?
【发布时间】:2014-03-19 07:53:52
【问题描述】:

我想为我的商店创建一个库存应用。我创建了一个活动来获取产品名称以及购买价格和销售价格,然后拍摄产品照片并将主题保存到 ListView。我正在使用 Sqlite。我无法保存这些。

这是我获取信息的代码:

package com.kalagar.warehouse;

import java.io.ByteArrayOutputStream;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;

public class AddNew extends Activity implements View.OnClickListener {

    ImageButton ib;
    Button b;
    ImageView iv;
    Intent i;
    final static int CameraData = 0;
    Bitmap bmp;

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

    private void startAddNew() {
        ib = (ImageButton) findViewById(R.id.ibTakePic);
        b = (Button) findViewById(R.id.bSave);
        iv = (ImageView) findViewById(R.id.ivPic);
        b.setOnClickListener(this);
        ib.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.ibTakePic:
            i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(i, CameraData);
            break;

        case R.id.bSave:
            break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            bmp = (Bitmap) data.getExtras().get("data");
            iv.setImageBitmap(bmp);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            byte[] byteArray = stream.toByteArray();
        }
    }

}

这是我的数据库:

package com.kalagar.warehouse;

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

public class DataBase {

    @SuppressWarnings("unused")
    private static class WareHouseDdbHelper extends SQLiteOpenHelper {

        private static final String LOGTAG = "WAREHOUSE";

        static final String DATABASE_TABLE = "WareHouse";
        static final int DATABASE_VERSION = 1;
        static final String DATABASE_NAME = "SellList";

        static final String ROW_ID = "_id";
        static final String ROW_NAME = "nameOfObject";
        static final String ROW_KHARID = "ghBuy";
        static final String ROW_FOROUSH = "ghSell";
        static final String ROW_PICTURE = "picture";

        private static final String TABLE_CREATE = "CREATE TABLE "
                + DATABASE_TABLE + " (" + ROW_ID
                + " INTEGER PRIMARY KEY AUTOINCREMENT, " + ROW_NAME + " TEXT, "
                + ROW_KHARID + " NUMERIC, " + ROW_FOROUSH + " NUMERIC, "
                + ROW_PICTURE + " TEXT " + ")";

        public WareHouseDdbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(TABLE_CREATE);
            Log.i(LOGTAG, "Table has been create");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
            onCreate(db);
        }
    }
}

【问题讨论】:

  • 无法保存它们并没有帮助需要更多关于问题的详细信息以更好地帮助
  • 我想保存这些参数并在列表视图中显示主题。我怎样才能做到这一点?什么代码需要我的保存按钮?
  • 您需要将方法添加到您的 sql 类中,以便在保存之前将记录插入数据库中
  • 好的。我必须添加什么方法?

标签: android sqlite listview


【解决方案1】:

首先,您应该阅读一些关于 SQLiteOpenHelpers 的教程。这是给你的one

完成此操作后,使用saveImage()getListOfImages() 等一些基本方法编写自己的OpenHelper。我相信您将能够根据您的需要解决这些问题。

现在,让我们开始保存图像: 在onActivityResult 收到位图后,您可以使用以下代码保存它:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ENGLISH).format(new Date());
File pictureFile = new File(PATH_IMAGES, "IMG_" + timeStamp + ".jpg");
FileOutputStream fos = new FileOutputStream(pictureFile);
bitmap.compress(CompressFormat.JPEG, 90, fos);
fos.flush();
fos.close();

一旦您将图像写入磁盘,您可以在您创建的 open helper 的帮助下获取图像的绝对路径并将其保存在数据库中:

String imagePath = pictureFile.getAbsolutePath();
yourImageOpenHelper.insertImage(imagePath);

下一步是检索图像列表并使用 ListView 或 GridView 任何适合您的需要显示它。

在这里,您需要以列表或数组的形式获取保存在数据库中的所有图像。获得列表后,您需要检查图像是否确实存在?您可能认为它们将永远存在,但如果有人手动删除了图像怎么办?为此,这里有一个简单的solution

最后,在将图像加载到ListView 时,您需要担心的是java.lang.OutOfMemoryError。如果您自己实现所有内容,您可能想看看Displaying Bitmaps Efficiently

如果您没有时间学习或没有准备好迎接挑战,您可以随时使用库。这是library

我建议您不要使用任何库,因为它会让您接触到 Android 的基础知识。休息显然取决于你。

希望这会有所帮助.. :)

【讨论】:

    【解决方案2】:

    您可以尝试参考this lib。从相机拍照后,将此图像写入存储,然后您可以获得图像的路径。现在,您可以将路径放入 sqlite。 PS:见this class的lib

    【讨论】:

      猜你喜欢
      • 2017-01-17
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多