java - 将从图库中选择或从相机捕获的图像添加到另一个活动的网格视图中
问题描述
我有一个带有捕获按钮的活动,单击此捕获按钮时,它会提示用户一个警报对话框,要求在做出决定并捕获图像或选择它之后在图库和相机之间进行选择,应用程序当前将图像保存在图像视图中,现在我怎样才能将图像保存在另一个活动而不是图像视图的网格视图中,并尽可能避免使用sqlite?!
主要活动.java:
public static final int CAMERA_PERM_CODE = 101;
public static final int CAMERA_REQUEST_CODE = 102;
public static final int GALLERY_REQUEST_CODE = 105;
DatabaseHelper mDatabaseHelper;
Cursor data;
Cursor price;
ArrayList<myDataClass> listData;
ArrayAdapter adapter;
ArrayList arrayList;
public SwipeMenuListView mListview;
CustomAdapter custom;
private TextView total;
ImageView camera;
ImageView display1;
String currentPhotoPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listitemsbought);
getSupportActionBar().hide();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
mListview = (SwipeMenuListView) findViewById(R.id.list_items_bought);
mDatabaseHelper = new DatabaseHelper(this);
data = mDatabaseHelper.getDataOfTable();
total = (TextView) findViewById(R.id.totalpriceofitems);
listData = new ArrayList<myDataClass>();
camera = (ImageView) findViewById(R.id.imagetopic);
display1 = (ImageView) findViewById(R.id.displayimage);
display1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Listitemsbought.this,savedPics.class);
overridePendingTransition(R.anim.slide_in,R.anim.slide_out);
startActivity(intent);
}
});
camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
askCameraPermission();
}
});
// adapter = new ArrayAdapter<String>(this, R.layout.list_boughts,R.id.Name,listData);
populateListView();
final SwipeMenuCreator creator = new SwipeMenuCreator() {
@Override
public void create(SwipeMenu menu) {
// create "delete" item
SwipeMenuItem deleteItem = new SwipeMenuItem(
getApplicationContext());
// set item background
deleteItem.setBackground(new ColorDrawable(Color.rgb(0,
0, 0)));
// set item width
deleteItem.setWidth((250));
// set a icon
deleteItem.setIcon(R.drawable.sym_keyboard_delete_holo_dark);
// add to menu
menu.addMenuItem(deleteItem);
}
};
// set creator
mListview.setMenuCreator(creator);
// Left
mListview.setSwipeDirection(SwipeMenuListView.DIRECTION_LEFT);
}
private void askCameraPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.CAMERA}, CAMERA_PERM_CODE);
}else {
alert();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == CAMERA_PERM_CODE){
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
alert();
}
}else {
Toast.makeText(this,"Camera Permission is required to use camera.",Toast.LENGTH_SHORT).show();
}
}
private void alert() {
new AlertDialog.Builder(Listitemsbought.this)
.setTitle(null)
.setMessage("Do you want to open gallery or take a new photo")
// Specifying a listener allows you to take an action before dismissing the dialog.
// The dialog is automatically dismissed when a dialog button is clicked.
.setPositiveButton("Open Camera", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dispatchTakePictureIntent();
}
})
// A null listener allows the button to dismiss the dialog and take no further action.
.setNegativeButton("Gallery", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent gallery = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(gallery, GALLERY_REQUEST_CODE);
}
})
.setIcon(android.R.drawable.ic_menu_camera)
.show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(requestCode == CAMERA_REQUEST_CODE){
if(resultCode == Activity.RESULT_OK){
File f = new File(currentPhotoPath);
display1.setImageURI(Uri.fromFile(f));
Log.d("tag", "ABsolute Url of Image is " + Uri.fromFile(f));
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
}
if(requestCode == GALLERY_REQUEST_CODE){
if(resultCode == Activity.RESULT_OK){
Uri contentUri = data.getData();
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp +"."+getFileExt(contentUri);
Log.d("tag", "onActivityResult: Gallery Image Uri: " + imageFileName);
display1.setImageURI(contentUri);
}
}
}
private String getFileExt(Uri contentUri) {
ContentResolver c = getContentResolver();
MimeTypeMap mime = MimeTypeMap.getSingleton();
return mime.getExtensionFromMimeType(c.getType(contentUri));
}
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
// File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = image.getAbsolutePath();
return image;
}
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.medicnes.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);
}
}
}
private void populateListView(){
while (data.moveToNext()){
listData.add(new myDataClass(data.getString(data.getColumnIndex("Name")),data.getString(data.getColumnIndex("Amount")),data.getString(data.getColumnIndex("Price"))));
}
total.setText(mDatabaseHelper.getPriceSum());
custom = new CustomAdapter(listData, this);
mListview.setAdapter(custom);
//custom.notifyDataSetChanged();
}
public class CustomAdapter extends BaseAdapter
{
private Context context;
private List<String> strings;
public class ViewHolder {
TextView textName;
TextView textAmount;
TextView textPrice;
}
public List<myDataClass> parkingList;
private CustomAdapter(List<myDataClass> apps, Context context) {
this.parkingList = apps;
this.context = context;
arrayList = new ArrayList<myDataClass>();
arrayList.addAll(parkingList);
}
@Override
public int getCount() {
return parkingList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, final ViewGroup parent)
{
View rowView = convertView;
ViewHolder viewHolder = null;
if (rowView == null) {
LayoutInflater inflater = getLayoutInflater();
rowView = inflater.inflate(R.layout.list_boughts, parent, false);
viewHolder = new ViewHolder();
viewHolder.textName = rowView.findViewById(R.id.Name);
viewHolder.textAmount = rowView.findViewById(R.id.sdadprice);
viewHolder.textPrice = rowView.findViewById(R.id.dfsdfad);
rowView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// here setting up names and images
viewHolder.textName.setText(parkingList.get(position).getProdaname() + "");
viewHolder.textAmount.setText(parkingList.get(position).getAmount());
viewHolder.textPrice.setText(parkingList.get(position).getPrice());
System.out.println(parkingList.get(position).getPrice());
mListview.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
// delete
mDatabaseHelper.delete(parkingList.get(position).getProdaname());
System.out.println(parkingList.get(position).getProdaname());
listData.remove(index);
custom.notifyDataSetChanged();
populateListView();
// false : close the menu; true : not close the menu
return false;
}
});
return rowView;
}
}
解决方案
在范围存储中创建一个离线数据库,但当用户卸载应用程序时,该数据库将被删除。
File mainfolder = getDir("datafolder", Context.MODE_PRIVATE);
Bitmap bitmap = BitmapFactory.decode(currentphotopath);
String name = new SimpleDateFormate("dd_mm_yyyy_hhss") + ".jpg"; // this or generate new file name each time user uploads.
File file = new File(mainfolder, name);
FileOutputStreme fout = new FIleOutputStreme(file);
bitmap.compress(jpg, 100, fout);
fout.close();
//listing all the files in mainfolder and set to gridview
File[] files = mainfolder.listFiles();
customView cview = new customView(this, files);
gridview.setAdapter(cview);
//适配器自定义视图类
public class customview extends ArrayAdapter{
private Files[] files;
.
.`
.
public customview (Activity activity, Files[] fls){
files = fls;
}
@Override
public View getView(int position, View convertView, final ViewGroup parent){
Bitmap bitmap = BitmapFactory.decode(files[position].getAbsolutePath());
imageview.setImageBitmap(bitmap);
}
}
推荐阅读
- python - 根据sqlite python中的用户选择更改查询
- c++ - 如何从我的 C++ 测试代码中删除冗余
- javascript - 动态删除 AMCharts 中的类别
- angular - 如何在相同的组件中传递不同的参数(在 Angular 中)?
- r - 几何色带,曲线下的阴影区域高于特定阈值?
- r - 从Foreach获取输出等于R中for循环的结果
- java - 使用 Jakarta XML 3.0+ 依赖项时无法创建 XML 文件
- javascript - React Webpack proces.env.PUBLIC_URL 未定义
- python - Numpy多项式和Matlab polyfit产生的线性方程的输出之间的差异
- c# - 为基于排队计时器的 HTTP 调用创建异步方法