Android-拍一拍功能

本文详细介绍了如何在Android应用中实现图片的界面展示、SQLite数据库存储、文件操作、数据匹配器及功能实现。包括定义对象属性、数据库连接、图片的增删改查操作、文件的保存和读取以及数据适配器的设计。通过这些步骤,可以构建一个基本的图片管理和显示系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、界面设计

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.cqjtu.chenhe.cameralistdemo.MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我的图片"
        android:textSize="20sp"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">
        <ListView
            android:id="@+id/photoList"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp">
        </ListView>
    </LinearLayout>
    <ImageView
        android:id="@+id/btn_camera"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_gravity="center"
        android:src="@drawable/camer" />
</LinearLayout>

二、设计对象属性与数据库表

1) 定义对象属性

public class Photo {
private int id;
private String fi1eName;private Bitmap bitmap;private String info;
}

2)定义一个SQLite数据库连接

pub1ic class DataBaseAccess extends sQLiteOpenHe1per {
public DataBaseAccess(Context context,String name, int version)i
super(context,name,nu11,version) ;
@Override
public void onCreate(SQLiteDatabase db)
System. out.println("创建photo表");String sq1="create tab1e photo(\n " +
" id integer primary key autoincrement , \n"+" name text,\n”+
” info text\n"+")";
db.execsQL(sq1);
@Override

3) 定义一个类实现数据库的增删改查PhotoDAO

public class PhotoDAO {
    SQLiteDatabase sqLiteDatabase=null;
    Context context;
    PhotoDAO(Context context){
        this.context=context;
    }

//构造方法
  public void  connect(){
        DataBaseAccess dba=new DataBaseAccess(context,"photoDb",1);
        sqLiteDatabase=dba.getReadableDatabase();
    }

//图片插入
  public long insert(Photo photo){
        connect();
        ContentValues values=new ContentValues();
        values.put("name",photo.getFileName());
        values.put("info",photo.getInfo());
        long n=sqLiteDatabase.insert("photo",null,values);
        Toast.makeText(context, "插入成功"+n, Toast.LENGTH_SHORT).show();
        sqLiteDatabase.close();
        return n;
    }
//图片删除

public void delete(int id){

  connect();
    String sql="delete from photo where id="+id; //注意没有delete * from
   sqLiteDatabase.execSQL(sql);
   Toast.makeText(context, "删除成功", Toast.LENGTH_SHORT).show();
  }

//图片查询

public List<Photo> findPhoto(){

  connect();
  List<Photo> photoList=new ArrayList<>();
 String sql="select * from photo";
 Cursor cursor=sqLiteDatabase.rawQuery(sql,null);
 while(cursor.moveToNext()){
   int id=cursor.getInt(cursor.getColumnIndex("id"));
    String name=cursor.getString(cursor.getColumnIndex("name"));
   String info=cursor.getString(cursor.getColumnIndex("info"));
   Photo p=new Photo();
   p.setId(id);
  p.setFileName(name);
  p.setInfo(info);
  photoList.add(p);
}
sqLiteDatabase.close();
return photoList;
    }
}

三、文件存储类ImageFileAccess

public class ImageFileAccess {
    Context context;
    ImageFileAccess(Context context){
        this.context=context;
    }
 public void saveImageFile(String fileName,Bitmap bitmap){
        try {
 FileOutputStream fos=context.openFileOutput(fileName,MODE_PRIVATE);
            bitmap.compress(Bitmap.CompressFormat.JPEG,100,fos);
            Toast.makeText(context,"保存成功",Toast.LENGTH_SHORT).show();
            fos.flush();
            fos.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Bitmap readImageFile(String fileName){
        try {
            FileInputStream fis=context.openFileInput(fileName);
            Bitmap bitmap= BitmapFactory.decodeStream(fis);
            return bitmap;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    //删除文件
    public void delFile(String fileName){
        String path=context.getFilesDir().getPath();
        String filePath=path+"/"+fileName;
        File file=new File(filePath);
        file.delete();
    }
}

四、数据匹配器设计

public class PhotoAdapter extends BaseAdapter {
    private List photoDates;///Aadapter的数据源,
    private Context photoContext;//一个上下文
    PhotoAdapter(Context context, List datas) {
        this.photoDates = datas;
        this.photoContext = context;
    }
    @Override
    public int getCount() {
        return photoDates.size();
    }
    @Override
    public Object getItem(int position) {
        return photoDates.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //创建一个view对象(item),对象的样式采用自定义的layout样式
        View photoView = View.inflate(photoContext, R.layout.photo_layout, null);
        TextView tv_name = photoView.findViewById(R.id.photoName);
        TextView pic_info=photoView.findViewById(R.id.photoInfo);
        ImageView imageView=photoView.findViewById(R.id.photo);
        Photo s = (Photo) getItem(position);
        tv_name.setText(s.getFileName());
        pic_info.setText(s.getInfo());
        imageView.setImageBitmap(s.getBitmap());
        return photoView;
    }
}

五、功能实现

public class MainActivity extends AppCompatActivity {
    private ImageView btn_camera;
    private List<Photo> photos=new ArrayList<Photo>();
    private ListView photoList;
    private PhotoAdapter photoAdapter;
    private final static  int REQUEST_CAMERA=200;
    private PhotoDAO photoDAO=new PhotoDAO(this);// 数据库访问对象
    private ImageFileAccess imageFileAccess=new ImageFileAccess(this);//图形文件存储
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_camera= (ImageView) findViewById(R.id.btn_camera);
        photoList= (ListView) findViewById(R.id.photoList);

        初始化原来照片信息
        photos=photoDAO.findPhoto();
        initPhoto(photos);
        
        //点击查看每张图片
        photoList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Photo p= photos.get(position);
                String name=p.getFileName();
                long i=p.getId();
                Bitmap b=imageFileAccess.readImageFile(name+i);
                Intent intent=new Intent();
                intent.setClass(MainActivity.this,IamgeShowActivity.class);
                intent.putExtra("photo",b);
                intent.putExtra("fileName",name);
                intent.putExtra("fileInfo",p.getInfo());
                startActivity(intent);
            }
        });

        ///长按删除
        photoList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                final Photo p= photos.get(position);
                final int i=position;
                AlertDialog.Builder myDialog=new AlertDialog.Builder(MainActivity.this);
                myDialog.setTitle("提示");
                myDialog.setIcon(R.mipmap.ic_launcher);
                myDialog.setMessage("确定删除"+p.getFileName()+"?");
                myDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
//                        photos.remove(i);//删除集合
//                        photoAdapter.notifyDataSetChanged();//适配器更新数据
                        imageFileAccess.delFile(p.getFileName()+p.getId());//删除文件
                        photoDAO.delete(p.getId());//删除数据库记录
                        photos=photoDAO.findPhoto();
                        initPhoto(photos);
                    }
                });
                myDialog.setNegativeButton("取消",null);
                myDialog.show();
                return true;
            }
        });

        btn_camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //设置动作为调用照相机
                startActivityForResult(intent,REQUEST_CAMERA);//REQUEST_CAMERA请求码
            }
        });
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(data==null) return;
        Bundle bundle=data.getExtras();// 从data中取出传递回来的数据
        if(requestCode==REQUEST_CAMERA) {//请求码是获得照片
            final Bitmap b = (Bitmap) bundle.get("data"); 将data中的信息流解析为Bitmap类型
            View infoInputView=View.inflate(this,R.layout.mydialog,null);
            final EditText name_edit=infoInputView.findViewById(R.id.pName);
            final EditText info_edit=infoInputView.findViewById(R.id.pInfo);
            info_edit.setHint("信息");
            AlertDialog.Builder myDialog= new AlertDialog.Builder(MainActivity.this);
            myDialog.setTitle("描述一下");
            myDialog.setIcon(R.drawable.notes);
            myDialog.setView(infoInputView);
            myDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    String name=name_edit.getText().toString();
                    String info=info_edit.getText().toString();
                    Photo photo=new Photo();
                    photo.setFileName(name);
                    photo.setBitmap(b);
                    photo.setInfo(info);
                    long i=photoDAO.insert(photo);//保存图片信息到数据库
                    if(i!=-1){
                        imageFileAccess.saveImageFile(name+i,b);//保存图片文件
                    }
                    //photos.add(photo);
                    //photoAdapter.notifyDataSetChanged();
                    //利用数据库数据刷新
                    photos=photoDAO.findPhoto();
                    initPhoto(photos);
                }
            });
            myDialog.setNegativeButton("取消",null);
            myDialog.show();
        }
    }

    public void initPhoto(List<Photo> pList){
        List<Photo> photos=new ArrayList<>();
        for(Photo p :pList){
            String fileName=p.getFileName();
            Bitmap b=imageFileAccess.readImageFile(fileName+p.getId());
            p.setBitmap(b);
            photos.add(p);
        }
        photoAdapter=new PhotoAdapter(MainActivity.this,photos);
        photoList.setAdapter(photoAdapter);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值