选择大图时出错

时间:2017-03-24 18:42:00

标签: java android database

我正在将我的imageview转换为字节,当我选择最小尺寸的图像,即大约20kb-300kb,但是当我选择移动相机拍摄的图像时,它会显示错误。

private byte[] imageViewToByte(ImageView image) 
{
    Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    return byteArray;
} 

我的SQL查询是

sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS FOOD(Id INTEGER PRIMARY KEY AUTOINCREMENT, name DROPDOWN, price VARCHAR, image BLOB)");

在解码图像上我使用

byte[] foodImage = food.getImage();
    Bitmap bitmap = BitmapFactory.decodeByteArray(foodImage, 0, foodImage.length);
    holder.imageView.setImageBitmap(bitmap);

我获取数据的光标是

Cursor cursor = MainActivity.sqLiteHelper.getData("SELECT * FROM FOOD");
    list.clear();
    while (cursor.moveToNext()){
        int id = cursor.getInt(0);
        // int id = cursor.getInt(cursor.getColumnIndex("Id"));
        String name = cursor.getString(1);
        String price = cursor.getString(2);
        byte[] image = cursor.getBlob(3);

        list.add(new Notice(id,name, price, image));
    }

我得到了错误,即

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.project.sumit.diems_onlinenoticeboard, PID: 4122
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.project.sumit.diems_onlinenoticeboard/com.project.sumit.diems_onlinenoticeboard.NoticeActivityAll}: java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2326)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                  at android.app.ActivityThread.access$800(ActivityThread.java:147)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5264)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)
               Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                  at android.database.CursorWindow.nativeGetLong(Native Method)
                  at android.database.CursorWindow.getLong(CursorWindow.java:511)
                  at android.database.CursorWindow.getInt(CursorWindow.java:578)
                  at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:69)
                  at com.project.sumit.diems_onlinenoticeboard.NoticeActivityAll.onCreate(NoticeActivityAll.java:58)
                  at android.app.Activity.performCreate(Activity.java:5975)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                  at android.app.ActivityThread.access$800(ActivityThread.java:147) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:135) 
                  at android.app.ActivityThread.main(ActivityThread.java:5264) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:372) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695) 

Plz帮助我,我试图解决这个问题从很多天但我无法完成。

1 个答案:

答案 0 :(得分:0)

写文件:

private String saveFile(Bitmap imageToSave, String fileName) {

File file = null;

  try {
    file = new File(new File(Environment.getExternalStorageDirectory() + "/Food"), fileName);
    FileOutputStream out = new FileOutputStream(file);
    imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, out);
    out.flush();
    out.close();

  } catch (Exception e) {
    e.printStackTrace();
  }

  return file.getAbsolutePath();
}

阅读文件:

BitmapFactory.Options options = new BitmapFactory.Options();

options.inPreferredConfig = Bitmap.Config.ARGB_8888;

Bitmap bitmap = BitmapFactory.decodeFile(food.getImageUrl(), options);
holder.imageView.setImageBitmap(bitmap);

不要忘记将这些权限添加到AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

更新SQLite查询:

sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS FOOD(Id INTEGER PRIMARY KEY AUTOINCREMENT, name DROPDOWN, price VARCHAR, imageUrl VARCHAR)");

更新您的Notice对象以使imageUrl,然后光标代码如下所示:

Cursor cursor = MainActivity.sqLiteHelper.getData("SELECT * FROM FOOD");
list.clear();
while (cursor.moveToNext()){
    int id = cursor.getInt(0);
    // int id = cursor.getInt(cursor.getColumnIndex("Id"));
    String name = cursor.getString(1);
    String price = cursor.getString(2);
    String imageUrl = cursor.getString(3);

    list.add(new Notice(id,name, price, imageUrl));
}