ListView中的SQL图像未显示Factory null

时间:2017-09-22 14:43:47

标签: java android sqlite listview android-sqlite

我正在处理存储在SQL数据库中的自定义ListView元素。我试图将位图转换为byteArray然后将其保存在数据库中,但是当我离开活动并返回时它不再存在。 我有一些错误,如

Dim

但我不知道如何解决它......

ListView的MainActivity:

D/skia: --- SkImageDecoder::Factory returned null

FotoItem适配器:

public class PictureActivity extends AppCompatActivity {
public static final int REQUEST_IMAGE_CAPTURE = 1;
private Camera camera;
private FotoItemAdapter listAdapter;
private static final int MY_PERMISSION_CAMERA = 1;
private FrameLayout mainLayout;
private ArrayList<FotoItem> posts;
private ImageAdapter gridAdapter;
private ListView listView;
private CalendarDB FDB;
private String name;
public Bitmap image;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initCamera();
    initPostList();
    initUI();
    initDB();
    initLayout();
    refreshArrayList();

}

private void initLayout(){mainLayout = (FrameLayout) findViewById(R.id.fotowand);}

private void initCamera() {
    camera = new Camera(this);
}

private void refreshArrayList() {
    ArrayList tempList = FDB.getAllFotos();
    posts.clear();
    posts.addAll(tempList);
    listAdapter.notifyDataSetChanged();
}

private void initDB() {
    FDB = new CalendarDB(this);
    FDB.open();
    name = FDB.getUserName();
}

private void initPostList() {
    posts = new ArrayList<>();
}

private void initUI() {
    setContentView(R.layout.activity_foto_wand);
    Point displaySize = getDisplaySize();

    GridView grid = new GridView(getApplicationContext());
    gridAdapter = new ImageAdapter(this, displaySize);
    grid.setAdapter(gridAdapter);

    listView = (ListView) findViewById(R.id.listview_foto_item);
    listAdapter = new FotoItemAdapter(this,posts);
    listView.setAdapter(listAdapter);


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    if (item.getItemId() == R.id.photo_add_button) {
        checkPermission();


    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSION_CAMERA:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                takePicture();
            } else {

            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

//checkt ob ´die Berechtigung für die Aufnahme vorhanden sind. Wenn nicht wird ein PopUp geöffnet um diese zuzulassen

private void checkPermission() {
    int permissionCheckCamera = ContextCompat.checkSelfPermission(this,
            Manifest.permission.CAMERA);
    int permissionCheckWriteExStorage = ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheckWriteExStorage == PackageManager.PERMISSION_DENIED || permissionCheckCamera == PackageManager.PERMISSION_DENIED) {

            Log.d("photo", "permission ist nicht da ");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSION_CAMERA);

        }
        else Log.d("photo", "permission ist schon da "); takePicture();
    }




private void takePicture() {
    Log.d("photo", "*photo*");
    camera.takePicture(REQUEST_IMAGE_CAPTURE);
}

private void processPicture(String path) {
    Point imageSize = new Point(getDisplaySize().x, getDisplaySize().y);
    image = camera.getScaledBitmap(path, imageSize);

    gridAdapter.addImage(image);
    gridAdapter.notifyDataSetChanged();



}

private Point getDisplaySize() {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    return size;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        processPicture(camera.getCurrentPhotoPath());
        Log.d("foto",Integer.toString(requestCode)+" "+ Integer.toString(resultCode));
    }
        showPopupImage();
}


public void showPopupImage() {

    // get a reference to the already created main layout


    // inflate the layout of the popup window
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    final View popupView = inflater.inflate(R.layout.layout_popup_image, null);

    // create the popup window
    int width = LinearLayout.LayoutParams.MATCH_PARENT;
    int height = LinearLayout.LayoutParams.MATCH_PARENT;
    boolean focusable = true; // lets taps outside the popup also dismiss it
    final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);


    // show the popup window
    popupWindow.showAtLocation(mainLayout, Gravity.CENTER, 0, 0);


    final ImageView imageView = (ImageView) popupView.findViewById(R.id.foto_image_popup);
    imageView.setImageBitmap(gridAdapter.getItem(gridAdapter.getCount()-1));

    final EditText editText = (EditText) popupView.findViewById(R.id.foto_edit_commentary_popup);

    final Button buttonAdd = (Button) popupView.findViewById(R.id.foto_button_popup);

    final String nameuser = FDB.getUserName();


    buttonAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            image.compress(Bitmap.CompressFormat.JPEG, 10, stream);
            byte[] byteArray = stream.toByteArray();

            String nameuser = FDB.getUserName();
            String namewg = FDB.getWGName();
            FDB.insertFotoItem(editText.getText().toString(), byteArray, nameuser,namewg);
            FotoItem fotoItem = new FotoItem(editText.getText().toString(), byteArray,nameuser,0);
            posts.add(0, fotoItem);
            listAdapter.notifyDataSetChanged();
            popupWindow.dismiss();
            listView.smoothScrollToPosition(0);
        }
    });
}
}

FotoItem:

公共类FotoItem扩展了PictureActivity {

public class FotoItemAdapter extends ArrayAdapter<FotoItem> {

private Context context;
private CalendarDB SEDB;
private ArrayList<FotoItem> posts;
private ArrayList<CommentaryItem> comments;
private CommentaryAdapter commentaryAdapter;


public FotoItemAdapter(Context context, ArrayList<FotoItem> listItems) {
    super(context, R.layout.listelement_foto_item, listItems);
    this.context = context;
    this.posts = listItems;
    SEDB = new CalendarDB(context);

}


@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;

    if (v == null) {
        LayoutInflater vi;
        vi = LayoutInflater.from(context);
        v = vi.inflate(R.layout.listelement_foto_item, null);
    }

    final FotoItem fotoItem = getItem(position);

    if (fotoItem == null) {
        Log.d("check", "getView: ist null");
    }

    if (fotoItem != null) {

        Log.d("check", "getView: ist nicht null");
        TextView user = (TextView) v.findViewById(R.id.name_foto_user);
        user.setText(fotoItem.getUser());
        ImageView foto = (ImageView) v.findViewById(R.id.foto_view);
        TextView user_commentary = (TextView) v.findViewById(R.id.foto_user_commentary);
        final ImageButton thumbUp = (ImageButton) v.findViewById(R.id.foto_thumb_up);
        final ImageButton commentaryButton = (ImageButton) v.findViewById(R.id.foto_commentary_button);
        final TextView thumbCount = (TextView) v.findViewById(R.id.foto_thumbcount);
        final EditText commentary = (EditText) v.findViewById(R.id.commentary_box);
        final ImageView shareButton = (ImageView) v.findViewById(R.id.foto_share_button);
        final LinearLayout linearLayout = (LinearLayout) v.findViewById(R.id.layout_invisbile);
        final Button sendButton = (Button) v.findViewById(R.id.button_edit_add_comment);
        final ListView commentBox = (ListView) v.findViewById(R.id.listview_foto_commentary);
        final TextView avatar  = (TextView) v.findViewById(R.id.foto_avatar);
        if (fotoItem.getUser()!= null) {
            avatar.setText(Character.toString(fotoItem.getUser().charAt(0)));
        }
        comments = new ArrayList<>();
        commentaryAdapter = new CommentaryAdapter(context, comments);
        commentBox.setAdapter(commentaryAdapter);
        Log.d("imagedb", Arrays.toString(fotoItem.getImage()));
        Bitmap bitmap = BitmapFactory.decodeByteArray(fotoItem.getImage(),0,fotoItem.getImage().length);


        foto.setImageBitmap(bitmap);

        thumbCount.setText(Integer.toString(fotoItem.getThumbcount()));


        user_commentary.setText(fotoItem.getCommentary());
        Log.d("check", "Aufwand: " + fotoItem.getCommentary());

        thumbUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fotoItem.addthumbUp();
                thumbCount.setText(Integer.toString(fotoItem.getThumbcount()));
                thumbUp.setAlpha(0.2f);
                thumbUp.setClickable(false);

            }
        });

        commentaryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                linearLayout.setVisibility(View.VISIBLE);
                sendButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        CommentaryItem commentaryItem = new CommentaryItem(getContext(),commentary.getText().toString());
                        comments.add(commentaryItem);
                        commentaryAdapter.notifyDataSetChanged();
                        linearLayout.setVisibility(View.INVISIBLE);
                    }
                });
            }
    });

        shareButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Bitmap bitmap = BitmapFactory.decodeByteArray(fotoItem.getImage(),0,fotoItem.getImage().length);
                Bitmap icon = bitmap;
                Intent share = new Intent(Intent.ACTION_SEND);
                share.setType("image/jpeg");

                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.TITLE, "title");
                values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
                Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        values);


                OutputStream outstream;
                try {
                    outstream = context.getContentResolver().openOutputStream(uri);
                    icon.compress(Bitmap.CompressFormat.JPEG, 100, outstream);
                    outstream.close();
                } catch (Exception e) {
                    System.err.println(e.toString());
                }

                share.putExtra(Intent.EXTRA_STREAM, uri);
                context.startActivity(Intent.createChooser(share, "Share Image"));
            }
        });

    } return v;
}
}

在我离开活动之前没有数据库它可以正常运行... 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

将图像作为byte []存储在数据库中似乎非常耗费内存。而不是将图像保存为byte [],也许将图像保存到设备(有许多教程如何执行此操作)。然后保存到磁盘后,将图像的位置保存在数据库中。