本人是Android初学者,最近做小项目 遇到了一个问题,就是调用系统相机,然后把获取的图片显示到下拉列表上,起初总是被同一张照片覆盖。再网上看了许多前辈的代码后,今天终于弄成功了。前来分享一下,就是先让照片以固定命名之后,存在手机里,再让BitmapFactory.decodebyfile解析这个文件,得到位图之后,再保存到指定位置。 用一个List<String>保存这个文件的位置 再把List<String>适配到adapter里面 就可以了.直接上关键代码
//创建文件的位置
String url = Environment.getExternalStorageDirectory().toString()+"/image.jpg";
private List<String> mPlant;
//调用系统相机
private void takePhoto(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
imageFile = new File(url);
// 获取文件的Uri
Uri imageUri = Uri.fromFile(imageFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, 1);
}
//这个方法为照片动态命名
private String getName() {
SimpleDateFormat formet = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = new Date();
String str = formet.format(date);
return str;
}
//下面这个回调写的不严谨,仅供像我一样的新人参考
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//将所拍的照片解析成一个位图
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().toString()+"/image.jpg");
//为照片动态添加名字
String fileName =getName()+".jpg";
savePicture(fileName, bitmap);
//再保存照片之后。再把照片的路径也保存下来.
mPlants.add("data/data/com.example.phototo/files/"+fileName);
//这句有问题,只是效果展示,不应该没次都创建对象, 应该用adapter.notifydatachaged()方法来更新数据
ListAdapter adapter = new ListAdapter(this, mPlants);
//设置adapter
mListView.setAdapter(adapter);
super.onActivityResult(requestCode, resultCode, data);
}
//存储照片到指定位置,下段代码为借鉴前辈的
private void savePicture(String fileName,Bitmap bitmap) {
FileOutputStream fos =null;
try {//直接写入名称即可,没有会被自动创建;私有:只有本应用才能访问,重新内容写入会被覆盖
fos = MainActivity.this.openFileOutput(fileName, Context.MODE_PRIVATE);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);// 把图片写入指定文件夹中
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(null != fos) {
fos.close();
fos = null;
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
写给像我一样的新人看
//创建文件的位置
String url = Environment.getExternalStorageDirectory().toString()+"/image.jpg";
private List<String> mPlant;
//调用系统相机
private void takePhoto(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
imageFile = new File(url);
// 获取文件的Uri
Uri imageUri = Uri.fromFile(imageFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, 1);
}
//这个方法为照片动态命名
private String getName() {
SimpleDateFormat formet = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = new Date();
String str = formet.format(date);
return str;
}
//下面这个回调写的不严谨,仅供像我一样的新人参考
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//将所拍的照片解析成一个位图
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().toString()+"/image.jpg");
//为照片动态添加名字
String fileName =getName()+".jpg";
savePicture(fileName, bitmap);
//再保存照片之后。再把照片的路径也保存下来.
mPlants.add("data/data/com.example.phototo/files/"+fileName);
//这句有问题,只是效果展示,不应该没次都创建对象, 应该用adapter.notifydatachaged()方法来更新数据
ListAdapter adapter = new ListAdapter(this, mPlants);
//设置adapter
mListView.setAdapter(adapter);
super.onActivityResult(requestCode, resultCode, data);
}
//存储照片到指定位置,下段代码为借鉴前辈的
private void savePicture(String fileName,Bitmap bitmap) {
FileOutputStream fos =null;
try {//直接写入名称即可,没有会被自动创建;私有:只有本应用才能访问,重新内容写入会被覆盖
fos = MainActivity.this.openFileOutput(fileName, Context.MODE_PRIVATE);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);// 把图片写入指定文件夹中
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(null != fos) {
fos.close();
fos = null;
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
写给像我一样的新人看