调用系统相机和相册上传图片的流程:
1.点击一个按钮触发调用操作。
case R.id.photograph:
// 拍照
photograph.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");//调用系统照相机的代码
// 2判断存储卡是否可以用,可用进行存储
String tempFileName = "";
if(type == 1){
tempFileName = IMAGE_FRONT;
}else if(type == 2){
tempFileName = IMAGE_BACK;
}else if(type == 3){
tempFileName = IMAGE_HANDS;
}
//3从内存卡读取存储的照片,传给请求照片的页面
if (hasSdcard()) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Environment
.getExternalStorageDirectory(),
tempFileName)));
}
startActivityForResult(intent, PHOTO_REQUEST_CAMERA);
}
});
//4用onActivityResult()方法根据不同的请求码保存获得的图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) { // resultCode == RESULT_OK表示系统返回的是否成功的判断码
switch (requestCode) {
case PHOTO_REQUEST_CAMERA:
setResult(2001,data);//5用setResult方法把图片保存起来,2001为结果码,data为图片数据。
finish();//6.该方法一定要写
break;
case PHOTO_REQUEST_GALLERY:
setResult(2002,data);
finish();
break;
}
}
//7返回前一个界面,根据结果码显示图片。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
//选择图片
if (resultCode == 2002 && data != null) {
Uri uri = data.getData();
crop(uri);//8对选择的图片进行裁剪
} else if (requestCode == PHOTO_REQUEST_CUT) { //裁剪
if (data == null)
return;
if (type == 1) {
//9把选择的图片显示到指定的控件上。
XGlide.init(this).display(iv_front, outFrontUri);
//10,根据图片的Uri,获得其在文件系统中的路径
frontImagePath = getRealFilePath(ApplyAgentActivity.this, outFrontUri);
} else if (type == 2) {
XGlide.init(this).display(iv_back2, outBackUri);
backImagePath = getRealFilePath(ApplyAgentActivity.this, outBackUri);
} else if (type == 3) {
XGlide.init(this).display(iv_img, outHandUri);
handleImagePath = getRealFilePath(ApplyAgentActivity.this, outHandUri);
}
} else if(resultCode == 2001){ //拍照
File tempFile = null;
if (hasSdcard()) {
if (type == 1) {
tempFile = new File(
Environment.getExternalStorageDirectory(),//访问sd卡APP专属文件中照片
IMAGE_FRONT);
} else if (type == 2) {
tempFile = new File(
Environment.getExternalStorageDirectory(),
IMAGE_BACK);
} else if (type == 3) {
tempFile = new File(
Environment.getExternalStorageDirectory(),
IMAGE_HANDS);
}
crop(Uri.fromFile(tempFile));
} else {
showTips("未找到存储卡,无法存储照片!", null);
}
}
} catch (Exception e) {
}
}
根据图片的Uri,获得其在文件系统中的路径的方法
public String getRealFilePath(final Context context, final Uri uri) {
if (null == uri)
return null;
final String scheme = uri.getScheme();
String data = null;
if (scheme == null)
data = uri.getPath();
else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
data = uri.getPath();
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
Cursor cursor = context.getContentResolver().query(uri,
new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
if (index > -1) {
data = cursor.getString(index);
}
}
cursor.close();
}
}
return data;
}
图片自由裁剪
/**
* 裁剪图片
*/
private void crop(Uri uri) {
outFile = new File(sd, "tsxn" + SystemClock.currentThreadTimeMillis()
+ ".png");
if (type == 1) {
outFrontUri = Uri.fromFile(outFile);
outUri = outFrontUri;
} else if (type == 2) {
outBackUri = Uri.fromFile(outFile);
outUri = outBackUri;
} else if (type == 3) {
outHandUri = Uri.fromFile(outFile);
outUri = outHandUri;
}
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1); X方向上的比例
intent.putExtra("aspectY", 1); Y方向上的比例
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", 480); 裁剪区的宽
intent.putExtra("outputY", 480); 裁剪区的高
intent.putExtra(MediaStore.EXTRA_OUTPUT, outUri);// 将URI指向相应的file
// 图片格式
intent.putExtra("outputFormat", "png");
intent.putExtra("noFaceDetection", true);// 取消人脸识别
intent.putExtra("return-data", true);// 是否将数据保留在Bitmap中返回 startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
从内存卡中读取照片的步骤
一、在mainfest中获取读取SD卡的权限
<!--在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 从SDCard读取数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
二、找到SD卡的目录
/**
* Environment.getExternalStorageDirectory()得到:“、mnt/sdcard” 即找到了sd卡的根目录
*/
private String path=Environment.getExternalStorageDirectory()+"client/tile/1.jpg";
三、根据路径获取图片
File mFile=new File(path);
//若该文件存在
if (mFile.exists()) {
Bitmap bitmap=BitmapFactory.decodeFile(path);
return bitmap;
}
注意:
在读取sd卡中图片的过程中的一些可用判断
1、
/***有些时候我们的手机没有安装SD卡
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { String path=Environment.getExternalStorageDirectory().getPath();
}
2、获取SD卡权限成功
private String path=Environment.getExternalStorageDirectory()+"client";
File file=new File(path);
if (file.canRead()) {
Log.v("TAG", "可读");
}
if (file.canWrite()) {
Log.v("TAG", "可写");
}
是时候弄清楚getExternalStorageDirectory()和getExternalFilesDir()的区别了
App专属文件 vs App独立文件
app专属文件:就是那些只有该app才可以使用的文件,例如专属格式的电子书,这类文件当我们删除应用之后,还应该保留在手机上的,例如拍照的照片,不应该随着删除应用而被删除掉。对于这类文件,Android给我们提供了特定的目录,这些目录都是以DIRECTORY开头的,例如:DIRECTORY_MUSIC , DIRECTORY_PICTURES.
访问APP专属文件夹有两种方式:
第一种:
File sdCard = Environment.getExternalStorageDirectory();
File directory_pictures = new File(sdCard, "Pictures");
第二种:
File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
app独立文件就是那些不依赖于某特定app的文件,例如照片。这类文件应该是随着app删除而一起删除的,它们可以被存储在两个地方:internal storage 和 external storage 。 internal storage就是手机自带的一块存储区域,通常很小;external storage就是通常所说的SD卡,通常很大,有16GB,32GB等。internal storage很小,所以你就应该很正确的使用它,因为SD卡有可能会被用户卸下,换成新的,所以SD卡不是任何时间都可用的,因此我们必须将一些重要的数据库文件以及一些用户配置文件存放在internal storage中。将一些大的图片或文件等缓存放到external storage中。这是你app私有的目录,你的shared preference文件,数据库文件,都存储在这里。目录为data/data/< package name >/files/
访问方法为:
File filesDir = getFilesDir();
获得这个路径的方法:
File externalFilesDir = getExternalFilesDir(null);
添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
File externalFilesDir = getExternalFilesDir("Caches");
MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作了。