目前关于上传头像的应用用的非常频繁。比如滴滴快车,神州专车的个人信息中就有这样的需求。
对于头像的上传是相机拍照和保存相册的典型应用,为了更好的理解究竟用到了那些技术,这里一一介绍。
1:调用相机的功能;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 调用android自带的照相机
// photoUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
startActivityForResult(intent, 1);
2:调用相册的功能:
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);// 调用android的图库
startActivityForResult(i, 2);
3:保存相册的功能:
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
// 检测sd是否可用
Log.v("TestFile",
"SD card is not avaiable/writeable right now.");
return;
}
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式
FileOutputStream b = null;
File file = new File("/sdcard/myImage/");
file.mkdirs();// 创建文件夹,名称为pk4fun //
// 照片的命名,目标文件夹下,以当前时间数字串为名称,即可确保每张照片名称不相同。网上流传的其他Demo这里的照片名称都写死了,则会发生无论拍照多少张,后一张总会把前一张照片覆盖。细心的同学还可以设置这个字符串,比如加上“IMG”字样等;然后就会发现sd卡中myimage这个文件夹下,会保存刚刚调用相机拍出来的照片,照片名称不会重复。
String str = null;
Date date = null;
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");// 获取当前时间,进一步转化为字符串
date = new Date(resultCode);
str = format.format(date);
String fileName = "/sdcard/myImage/" + str + ".jpg";
try {
b = new FileOutputStream(fileName);
/*
* BufferedOutputStream bos = new BufferedOutputStream( new
* FileOutputStream(file));
*/
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
b.flush();
b.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* Intent intent = new Intent(
* Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri =
* Uri.fromFile(file); intent.setData(uri);
* sendBroadcast(intent);
*///
// sendBroadcast(fileName);
MediaScannerConnection.scanFile(getApplicationContext(),
new String[] { fileName }, null, null);
注意 这里保存相册用到了创建文件:
File file = new File("/sdcard/myImage/");
file.mkdirs();//
将文件 写入输出流:用刀try catch
try {
b = new FileOutputStream(fileName);
/*
* BufferedOutputStream bos = new BufferedOutputStream( new
* FileOutputStream(file));
*/
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
b.flush();
b.close();
} catch (IOException e) {
e.printStackTrace();
}
}
当初在这里纠结了老半天,b = new FileOutputStream(fileName);总是空,首先是作用域,以及FileOutputStream和BufferedOutputStream的使用。
用于显示:
((ImageView) findViewById(R.id.imageView)).setImageBitmap(bitmap);// 将图片显示在ImageView里
最后 是适用的权限:也害了我半天。
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />