在食堂管理页面(ManagerPage)点击上传按钮即跳转至本页面,在本页面可以上传菜品,有图片上传的功能,可以在相册中选择图片或者直接拍照。
注意事项:
(1)代码有一些缺陷。如果点击确认上传按钮前不选择图片会出错,因为在上传按钮触发事件中没有添加不上传图片是的处理方法,所以必须选择图片
(2)点击确认上传后,之前选择的图片会压缩并保存在应用关联缓存文件夹下:
内部存储/Android/data/com.....smartcanteen/cache
而后将压缩后图片修改名字为“菜品编号”+“dish.jpg”,并将图片绝对路径和菜品信息一起保存入数据库中;
(3)菜品编号是自己编的,原本在设想中根据食堂窗口菜品等等的不同,菜品会根据一套规则自己生成相应的编号,不过还没做出来,所以只能自己填。
Activity:UpDishesPage
package com.example.fanpeng.smartcanteen;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;
import android.widget.Toast;
import org.litepal.LitePal;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import id.zelory.compressor.Compressor;
public class UpDishesPage extends AppCompatActivity {
private EditText EditName1,EditPrice1,EditNum1;
private Button upDishes,clear,back;
private String TAG="mytag";
private User tempUser;
public static final int TAKE_PHOTO = 1;
public static final int CHOOSE_PHOTO = 2;
private ImageView picture;
private File outputImage;
private Uri imageUri;
private static String filePath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_up_dishes_page);
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
tempUser=(User)bundle.getSerializable("user1");
Log.d(TAG,tempUser.getPart());
//
upDishes=findViewById(R.id.upDishes_u);
clear=findViewById(R.id.clear_u);
back=findViewById(R.id.back_u);
EditName1=findViewById(R.id.name_1);
EditPrice1=findViewById(R.id.price_1);
EditNum1=findViewById(R.id.num1);//菜品编号
/图片处理//
Button takePhoto = findViewById(R.id.take_photo);
picture = findViewById(R.id.picture);
Button chooseFromAlbum = findViewById(R.id.choose_from_album);
//直接使用手机拍照
takePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//创建File对象,用于存储拍照后的照片
outputImage = new File(getExternalCacheDir(),"output_image.jpg");
try {
if (outputImage.exists()){
outputImage.delete();
}
outputImage.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 24){
imageUri = FileProvider.getUriForFile(UpDishesPage.this,"com.example.fanpeng.smartcanteen.fileprovider",outputImage);
}else {
imageUri = Uri.fromFile(outputImage);
}
//启动相机程序
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
});
//从相册中选择图片
chooseFromAlbum.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (ContextCompat.checkSelfPermission(UpDishesPage.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(UpDishesPage.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else {
openAlbum();
}
}
});
upDishes.setOnClickListener(new upDishesListener(tempUser));//注意传入参数,不然会产生null错误(或者将tempUser设为全局变量)
clear.setOnClickListener(new clearListener());
back.setOnClickListener(new backListener());
}
public class upDishesListener implements View.OnClickListener {
private User tempUser;
public upDishesListener(User user){
super();
this.tempUser=user;
}
@Override
public void onClick(View v){
Log.d(TAG,tempUser.getPart());
boolean flag=true;
String name="".equals(EditName1.getText().toString().trim())?"default":EditName1.getText().toString().trim();
Double price=Double.parseDouble("".equals(EditPrice1.getText().toString())?"0.00":EditPrice1.getText().toString());
String num="".equals(EditNum1.getText().toString().trim())?"00000":EditNum1.getText().toString().trim();
List<Dishes> dishes = LitePal.findAll(Dishes.class);
File compressedPicFile=saveCroppedImage(new File(filePath));//图片压缩并保存
Bitmap bm=BitmapFactory.decodeFile(compressedPicFile.getAbsolutePath());
picture.setImageBitmap(bm);
for(Dishes ds:dishes){
Log.d(TAG,ds.getName());
if(num.equals(ds.getDishNum())){//菜名可重复,编号不可重复(具体编号规则未定)
Toast.makeText(UpDishesPage.this,"菜品重复",Toast.LENGTH_SHORT).show();
flag=false;
break;
}
}
if(flag){
User user=LitePal.find(User.class,tempUser.getId(),true);//注意!!此处不能直接用之前的tempUser,而应再次从数据库激进查找,不然无法正确关联外键
String part=tempUser.getPart();
Dishes tempDish=new Dishes();
tempDish.setName(name);
tempDish.setPrice(price);
tempDish.setDishNum(num);
tempDish.setPicturePath(compressedPicFile.getAbsolutePath());
//---日期----//
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
tempDish.setUpDate(sdf.format(new Date()));
tempDish.setPart(part);
tempDish.save();
user.getMyUp().add(tempDish);
user.setDishesCount(user.getMyUp().size());
user.save();
Toast.makeText(UpDishesPage.this,name+"上传成功",Toast.LENGTH_SHORT).show();
}
}
}
public class clearListener implements View.OnClickListener{
@Override
public void onClick(View v) {//EditName1,EditPrice1,EditNum1
EditName1.setText("");
EditPrice1.setText("");
EditNum1.setText("");
}
}
public class backListener implements View.OnClickListener{
@Override
public void onClick(View v) {
finish();
}
}
//图片处理中的方法//
private void openAlbum(){
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent,CHOOSE_PHOTO);//打开相册
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
openAlbum();
}else {
Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case TAKE_PHOTO:
if (resultCode == RESULT_OK){
try {
//将拍摄的照片显示出来
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
filePath=outputImage.getAbsolutePath();//此时获得绝对路径(不确定到底是否应当获取相对/绝对路径)
/* File dishPicture=new File(getExternalCacheDir(),"id_image.jpg");//id为菜品编号
if(dishPicture.exists()){
dishPicture.delete();
}
dishPicture = new Compressor(this)
.setMaxWidth(400)
.setMaxHeight(300)
.setQuality(70)
.compressToFile(outputImage);//压缩*/
//Bitmap bm=BitmapFactory.decodeFile(dishPicture.getAbsolutePath());
//picture_compress.setImageBitmap(bm);
//showPath.setText(dishPicture.getAbsolutePath());
///等下存入数据库
}catch (FileNotFoundException e){
e.printStackTrace();
}
}
break;
case CHOOSE_PHOTO:
if (resultCode == RESULT_OK){
//判断手机系统版本号
if (Build.VERSION.SDK_INT >= 19){
//4.4及以上系统使用这个方法处理图片
handleImageOnKitKat(data);
}else {
//4.4以下系统使用这个放出处理图片
handleImageBeforeKitKat(data);
}
}
break;
default:
break;
}
}
@TargetApi(19)
private void handleImageOnKitKat(Intent data){
String imagePath = null;
Uri uri = data.getData();
if (DocumentsContract.isDocumentUri(this,uri)){
//如果是document类型的Uri,则通过document id处理
String docId = DocumentsContract.getDocumentId(uri);
if ("com.android.providers.media.documents".equals(uri.getAuthority())){
String id = docId.split(":")[1];//解析出数字格式的id
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
}else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())){
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));
imagePath = getImagePath(contentUri,null);
}
}else if ("content".equalsIgnoreCase(uri.getScheme())){
//如果是content类型的Uri,则使用普通方式处理
imagePath = getImagePath(uri,null);
}else if ("file".equalsIgnoreCase(uri.getScheme())){
//如果是file类型的Uri,直接获取图片路径即可
imagePath = uri.getPath();
}
displayImage(imagePath);//根据图片路径显示图片
}
private void handleImageBeforeKitKat(Intent data){
Uri uri = data.getData();
String imagePath = getImagePath(uri,null);
displayImage(imagePath);
}
private String getImagePath(Uri uri,String selection){
String path = null;
//通过Uri和selection来获取真实的图片路径
Cursor cursor = getContentResolver().query(uri,null,selection,null,null);
if (cursor != null){
if (cursor.moveToFirst()){
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
private void displayImage(String imagePath){
if (imagePath != null){
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
picture.setImageBitmap(bitmap);
filePath=imagePath;
//File compressedPicFile=saveCroppedImage(new File(imagePath));
//Bitmap bm=BitmapFactory.decodeFile(compressedPicFile.getAbsolutePath());
// picture_compress.setImageBitmap(bm);
//showPath.setText(compressedPicFile.getAbsolutePath());
}else {
Toast.makeText(this,"failed to get image",Toast.LENGTH_SHORT).show();
}
}
private File saveCroppedImage(File picFile) {//图片压缩与保存
File file = new File(getExternalCacheDir(),EditNum1.getText()+"dish.jpg");
if(file.exists()){
file.delete();
}
try {
file.createNewFile();
Bitmap compressBitmap = new Compressor(this)
.setMaxWidth(400)
.setMaxHeight(300)
.setQuality(70)
.compressToBitmap(picFile);//压缩
//bmp.compress(CompressFormat.JPEG, 50, fos);
ByteArrayOutputStream baos=new ByteArrayOutputStream();
compressBitmap.compress(Bitmap.CompressFormat.JPEG,100,baos);
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}
}
layout:activity_up_dishes_page.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
android:background="#fcfbf4"
tools:context=".UpDishesPage">
<TextView
android:text="编辑上传"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:layout_marginTop="20dp"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text="菜品信息:"
android:textSize="15sp"
android:layout_marginTop="15dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/name_1"
android:textSize="20sp"
android:hint="请输入菜名"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/price_1"
android:textSize="20sp"
android:hint="请输入价格"
android:inputType="number|numberDecimal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/num1"
android:textSize="20sp"
android:hint="请输入编号"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/picture"
android:layout_width="200dp"
android:layout_height="150dp"
android:layout_gravity="center_horizontal"
android:background="#e3e6c3"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
>
<Button
android:id="@+id/take_photo"
android:text="拍照上传"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="30dp"
android:background="#beb391"
android:textColor="#e3e6c3"/>
<Button
android:id="@+id/choose_from_album"
android:text="打开相册"
android:layout_marginLeft="25dp"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="30dp"
android:background="#beb391"
android:textColor="#e3e6c3"/>
</LinearLayout>
<Button
android:id="@+id/upDishes_u"
android:text="确 认 上 传"
android:layout_height="35dp"
android:layout_width="match_parent"
android:background="#9c886c"
android:textColor="#e3e6c3"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:textSize="18sp"
android:layout_marginTop="10dp"
/>
<Button
android:id="@+id/clear_u"
android:text="全 部 清 空"
android:layout_height="35dp"
android:layout_width="match_parent"
android:background="#beb391"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:textColor="#e3e6c3"
android:textSize="18sp"
android:layout_marginTop="5dp"
/>
<Button
android:id="@+id/back_u"
android:text="退 出 上 传"
android:layout_height="35dp"
android:layout_width="match_parent"
android:background="#beb391"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:textColor="#e3e6c3"
android:textSize="18sp"
android:layout_marginTop="5dp"
/>
</LinearLayout>