场景
很多应用都有设置下头像之类的需求,都需要相机相册,但是在6.0的时候加上了运行时权限检测,7.0的时候限制了在应用建共享文件,就是之前相机相册使用的file://URI
不能使用了。
因为在7.0及以上的应用中,android框架执行的(严苛模式)StrictMode API
政策禁止在您的应用外部公开file://URI
。如果一项包含文件URI 的intent离开您的应用,则应用出现故障,并报FileUriExposedException
异常。如果要在应用间共享文件,你应该发送一项content://URI
, 并授予URI 临时访问权限。进行此授权的最简单方式是使用FileProvider
类。
代码进行的逻辑
因为是帮助理解,所以代码的条理是从业务逻辑出发,顺着相机相册的使用进行代码的编写,提前准备的东西就放在需要使用的时候提及了。Utils–表示该代码是在工具类中使用的,Activity–表示该代码时在调用相机相册的Activity中使用的,Project–表示该代码时项目的配置性代码。
选择相机\相册(Utils)
通过弹窗让用户选择打开相机还是相册,注意这里打开相机的时候有权限检测。
chooseDialog = new AlertDialog.Builder(activity).setItems(
new String[]{"相机", "相册"},
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
switch (arg1) {
case 0:
//--检测是否有打开摄像头的权限
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
//去请求权限
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, 111);
} else {
selectPicFromCamera();
}
break;
case 1:
selectPicFromLocal();
default:
break;
}
}
}).create();
chooseDialog.show();
打开相机 (Utils)
注意要进行android版本判断,如果Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
,就用使用FileProvider
来获取Uri
/**
* 打开相机
*/
public void selectPicFromCamera() {
if (!CommUtils.isExitsSdcard()) {
Toast.makeText(mActivity, "没有SD卡", Toast.LENGTH_SHORT).show();
return;
}
//用户头像缓存目录
mFileUri.getParentFile().mkdirs();
Uri imgUri = Uri.fromFile(mFileUri);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//通过FileProvider创建一个content类型的Uri
imgUri = FileProvider.getUriForFile(mActivity, "zxl.fengye.mallstore.fileprovider", mFileUri);
}
//--调用系统相机
Intent intentCamera = new Intent();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
}
intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
//将拍照结果保存至photo_file的Uri中,不保留在相册中
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
mActivity.startActivityForResult(intentCamera, 2);
}
FileProvider(Project)
可以看到在打开相机的时候我们使用到了FileProvider
,这时我们就需要在项目里面设置一些东西,以便让我们能够在代码中使用FileProvider
。
- 1.在manifest中添加provider
注意authorities必须要独一无二,不然应用可能会在目标手机上无法安装。一般使用项目包名+自己定义的名字
<!-- 兼容android7.0 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="zxl.fengye.mallstore.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
- 2.资源文件下创建相应的xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path
name="external"
path="" />
<files-path
name="files"
path="" />
<cache-path
name="cache"
path="" />
</paths>
</resources>
<files-path/>
代表的根目录:Context.getFilesDir()
<external-path/>
代表的根目录:Environment.getExternalStorageDirectory()
<cache-path/>
代表的根目录:getCacheDir()
name 顺便取,代码中不会用到,但是在获取到的uri中会有;
path是允许访问的目录,为空表示可以访问对应根目录下的所有目录和文件
ok, 关于FileProvider的相关配置都完成了。接着看
打开相册(Utils)
/**
* 打开相册
*/
private void selectPicFromLocal() {
Intent intent1 = new Intent("android.intent.action.PICK");
intent1.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
mActivity.startActivityForResult(intent1, 1);
}
相册相机回调(Activity)
我们通过startActivityForResult
打开相机或者相册,所以在拍摄或者选取一张图片后我们需要在Activity中处理。
这里的fileUri 和 fileCropUri 都是全局变量,分别表示拍摄图片的存放位置和剪切后图片的存放位置:
private File fileUri = new File(CommUtils.getSDPath() + "/FengYe/img/", System.currentTimeMillis() + ".png");
private File fileCropUri = new File(CommUtils.getSDPath() + "/FengYe/imgCrop/", System.currentTimeMillis() + ".png");
- 请注意不管是在相册还是相机的回调中都需要进行android版本判断。因为在
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
的时候,是需要使用FileProvider
来获取Uri 的。
在我们获取到图片的uri之后,我们需要裁剪图片photoUtils.startPhotoZoom(newUri)
。
private Uri cropImageUri;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && data != null) { // 相册
if (!CommUtils.isExitsSdcard()) {
Toast.makeText(UserInfoActivity.this, "没有SD卡", Toast.LENGTH_SHORT).show();
return;
}
Uri newUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
cropImageUri = Uri.fromFile(fileCropUri);
newUri = Uri.parse(photoUtils.getPath(UserInfoActivity.this, data.getData()));
newUri = FileProvider.getUriForFile(this, "zxl.fengye.mallstore.fileprovider", new File(newUri.getPath()));
} else {
newUri = Uri.parse("file://" + photoUtils.getPath(UserInfoActivity.this, data.getData()));
}
photoUtils.startPhotoZoom(newUri);
} else if (requestCode == 2) { //拍照
Uri imgUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//通过FileProvider创建一个content类型的Uri
imgUri = FileProvider.getUriForFile(UserInfoActivity.this, "zxl.fengye.mallstore.fileprovider", fileUri);
} else {
imgUri = Uri.fromFile(fileUri);
}
photoUtils.startPhotoZoom(imgUri);
} else if (requestCode == 3 && data != null) {// 裁剪后
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
uploadPic(bitmap, handler);
}
}
获取文件路径(Utils)
相册相机回调中有使用到获取文件的路径的方法,photoUtils.getPath(UserInfoActivity.this, data.getData())
。需要注意的是在Android4.4之后选取的图片不再返回真实的Uri了,而是封装过的Uri ,所以在4.4以上,就要对这个Uri进行解析。
列举下4.4前后的文件路径的区别:
//4.4以上 content://com.android.providers.media.documents/document/image:3952
//4.4以下 content://media/external/images/media/3951
- 下面获取文件路径的方法是国外的一位开发者写的,国内多是转载,且有些自己修改后还不能使用了,这里贴出的代码也是我在网上转的,不敢确认是否原文,但在我的项目中使用是没有问题的。
@SuppressLint("NewApi")
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[]{
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
//Android 4.4以下版本自动使用该方法
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
裁剪图片(Utils)
在我们通过相机或者相册,拍摄或者选取一张图片后,我们需要对其进行裁剪,尤其是现在的手机相机越来越好,拍摄的照片越来越大,轻轻松松好几M。
这里也需要进行Android版本的判断,在Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
的时候,我们需要授予URI 临时访问权限intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
。
/**
* 兼容android7.0使用
* @param uri
*/
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
mActivity.startActivityForResult(intent, 3);
}
裁剪图片后的处理(Activity)
在相机相册的回调中我们已经看到了,剪裁后的回调处理了,上传的操作应接口而异,这里就不做表述了。至此,相关代码和逻辑已经表述完结了。
if (requestCode == 3 && data != null) {// 裁剪后
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
uploadPic(bitmap, handler);
}
源码
这里就是极其恐怖的源码地带了,先上工具类ChoosePhotoUtils
public final class ChoosePhotoUtils {
private AlertDialog chooseDialog;
private Activity mActivity;
private File mFileUri;
private File mFileCropUri;
public ChoosePhotoUtils(final Activity activity, File fileUri, File fileCropUri) {
this.mActivity = activity;
this.mFileUri = fileUri;
this.mFileCropUri = fileCropUri;
chooseDialog = new AlertDialog.Builder(activity).setItems(
new String[]{"相机", "相册"},
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
switch (arg1) {
case 0:
//--检测是否有打开摄像头的权限
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
//去请求权限
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, 111);
} else {
selectPicFromCamera();
}
break;
case 1:
selectPicFromLocal();
default:
break;
}
}
}).create();
chooseDialog.show();
}
/**
* 打开相册
*/
private void selectPicFromLocal() {
Intent intent1 = new Intent("android.intent.action.PICK");
intent1.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
mActivity.startActivityForResult(intent1, 1);
}
/**
* 打开相机
*/
public void selectPicFromCamera() {
if (!CommUtils.isExitsSdcard()) {
Toast.makeText(mActivity, "没有SD卡", Toast.LENGTH_SHORT).show();
return;
}
//用户头像缓存目录
mFileUri.getParentFile().mkdirs();
Uri imgUri = Uri.fromFile(mFileUri);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//通过FileProvider创建一个content类型的Uri
imgUri = FileProvider.getUriForFile(mActivity, "zxl.fengye.mallstore.fileprovider", mFileUri);
}
//--调用系统相机
Intent intentCamera = new Intent();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
}
intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
//将拍照结果保存至photo_file的Uri中,不保留在相册中
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
mActivity.startActivityForResult(intentCamera, 2);
}
/**
* 兼容android7.0使用
* @param uri
*/
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
mActivity.startActivityForResult(intent, 3);
}
/**
* Android4.4之后选取中的图片不再返回真实的Uri了,而是封装过的Uri,所以在4.4以上,就要对这个Uri进行解析,即上面的PhotoUtils.getPath()方法
*
* @param context 上下文对象
* @param uri 当前相册照片的Uri
* @return 解析后的Uri对应的String
*/
// 4.4以上 content://com.android.providers.media.documents/document/image:3952
// 4.4以下 content://media/external/images/media/3951
@SuppressLint("NewApi")
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[]{
split[1]
};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
//Android 4.4以下版本自动使用该方法
public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri.getAuthority());
}
}
再上使用的Activity,UserInfoActivity
public class UserInfoActivity extends BaseActivity {
@Bind(R.id.iv_title_left)
ImageView ivTitleLeft;
@Bind(R.id.tv_title)
TextView tvTitle;
@Bind(R.id.iv_title_right)
ImageView ivTitleRight;
@Bind(R.id.tv_score2award)
TextView tvScore2award;
@Bind(R.id.user_img_camera)
SimpleDraweeView userImgCamera;
@Bind(R.id.user_ing_info)
TextView userImgInfo;
@Bind(R.id.nick_key)
TextView nickKey;
@Bind(R.id.nick_value)
EditText nickValue;
@Bind(R.id.tel_key)
TextView telKey;
@Bind(R.id.tel_value)
TextView telValue;
@Bind(R.id.psw_key)
TextView pswKey;
@Bind(R.id.psw_value)
ImageView pswValue;
@Bind(R.id.address_key)
TextView addressKey;
@Bind(R.id.address_value)
EditText addressValue;
@Bind(R.id.address_manger_key)
TextView addressMangerKey;
@Bind(R.id.address_manger_value)
ImageView addressMangerValue;
@Bind(R.id.sex_key)
TextView sexKey;
@Bind(R.id.sex_value_women)
RadioButton sexValueWomen;
@Bind(R.id.sex_value_man)
RadioButton sexValueMan;
@Bind(R.id.viewGorp_ll)
LinearLayout viewGrop;
@Bind(R.id.box_all)
LinearLayout boxAll;
private String imgName;
private File outputImage;
private File fileUri = new File(CommUtils.getSDPath() + "/FengYe/img/", System.currentTimeMillis() + ".png");
private File fileCropUri = new File(CommUtils.getSDPath() + "/FengYe/imgCrop/", System.currentTimeMillis() + ".png");
private ChoosePhotoUtils photoUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_info);
ButterKnife.bind(this);
}
@Override
protected void onResume() {
super.onResume();
initView();
loadData();
}
private boolean isEdit = false;
private void initView() {
tvTitle.setText("个人资料");
ivTitleRight.setVisibility(View.GONE);
tvScore2award.setVisibility(View.VISIBLE);
tvScore2award.setText("完成");
tvScore2award.setTextColor(getResources().getColor(R.color.colorBlack));
userImgCamera.getBackground().setAlpha(100);//0~255透明度值
}
/**
* 初始化数据加载
*/
private int userId = UserInfoUtils.getUserInfoBean().getUserId();
private void loadData() {
if (!CommUtils.isNetWorkConnected(UserInfoActivity.this)) {
ToastUtil.showShort(UserInfoActivity.this, "请检查网络", Gravity.CENTER);
return;
}
//联网请求个人信息
...
}
/**
* 修改昵称等信息
*/
private void resetNickOrSex() {
if (!CommUtils.isNetWorkConnected(UserInfoActivity.this)) {
ToastUtil.showShort(UserInfoActivity.this, "请检查网络", Gravity.CENTER);
return;
}
//修改个人信息上传
...
}
@OnClick({R.id.viewGorp_ll, R.id.iv_title_left, R.id.tv_score2award, R.id.user_img_camera, R.id.tel_value, R.id.psw_value, R.id.address_manger_value})
public void onClick(View view) {
switch (view.getId()) {
case R.id.viewGorp_ll:
CommUtils.hideKeyboard(UserInfoActivity.this);
break;
case R.id.iv_title_left:
finish2Main();
break;
case R.id.tv_score2award:
telValue.setMaxEms(6);
telValue.setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)});
resetNickOrSex();
break;
case R.id.user_img_camera:
photoUtils = new ChoosePhotoUtils(UserInfoActivity.this, fileUri, fileCropUri);
break;
case R.id.tel_value:
startActivityForResult(new Intent(UserInfoActivity.this, ResetTelActivity.class), 10101);
break;
case R.id.psw_value:
startActivity(new Intent(UserInfoActivity.this, ResetPswActivity.class));//不同的ui
break;
case R.id.address_manger_value:
Intent intent1 = new Intent(UserInfoActivity.this, MangerAddressActivity.class);
startActivity(intent1);
break;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 111:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//同意
photoUtils.selectPicFromCamera();
} else {
//拒绝
Toast.makeText(this, "亲,相机权限被拒绝,\n请在设置中打开", Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}
private void finish2Main() {
Bundle bundle = new Bundle();
bundle.putString("nick", UserInfoUtils.getUserInfoBean().getNickName());
bundle.putString("img", UserInfoUtils.getUserInfoBean().getHeadImg());
UserInfoActivity.this.setResult(RESULT_OK, UserInfoActivity.this.getIntent().putExtra("nickImg", bundle));
UserInfoActivity.this.finish();
}
@Override
public void onBackPressed() {
finish2Main();
}
//-------------------------------头像处理---------------------------------
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case mConstants.IMG_MSG:
Bundle data = msg.getData();
String imgPath = (String) data.get("thumPath");
resetUserImg(imgPath);
break;
default:
break;
}
}
};
private Uri cropImageUri;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && data != null) { // 相册
if (!CommUtils.isExitsSdcard()) {
Toast.makeText(UserInfoActivity.this, "没有SD卡", Toast.LENGTH_SHORT).show();
return;
}
Uri newUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
cropImageUri = Uri.fromFile(fileCropUri);
newUri = Uri.parse(photoUtils.getPath(UserInfoActivity.this, data.getData()));
newUri = FileProvider.getUriForFile(this, "zxl.fengye.mallstore.fileprovider", new File(newUri.getPath()));
} else {
newUri = Uri.parse("file://" + photoUtils.getPath(UserInfoActivity.this, data.getData()));
}
photoUtils.startPhotoZoom(newUri);
} else if (requestCode == 2) { //拍照
Uri imgUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//通过FileProvider创建一个content类型的Uri
imgUri = FileProvider.getUriForFile(UserInfoActivity.this, "zxl.fengye.mallstore.fileprovider", fileUri);
} else {
imgUri = Uri.fromFile(fileUri);
}
photoUtils.startPhotoZoom(imgUri);
} else if (requestCode == 3 && data != null) {// 裁剪后
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
uploadPic(bitmap, handler);
}
//更新修改的Tel
if (requestCode == 10101 && data != null) {
String phone = data.getStringExtra("phone");
if (!TextUtils.isEmpty(phone)) {
String start = phone.substring(0, 2);
String end = phone.substring(8, 11);
telValue.setText(start + "******" + end);
}
} else {
loadData();
}
}
/**
* -----------上传图片----
*/
/**
* 返回json数据
*/
public void uploadPic(Bitmap bitmap, final Handler handler) {
if (!CommUtils.isNetWorkConnected(UserInfoActivity.this)) {
CommUtils.showSafeToast(UserInfoActivity.this, "请检查网络");
return;
}
//上传图片
...
}
/**
* 修改用户头像http:
*
* @param img
*/
private void resetUserImg(final String img) {
if (!CommUtils.isNetWorkConnected(UserInfoActivity.this)) {
CommUtils.showSafeToast(UserInfoActivity.this, "请检查网络");
return;
}
//修改用户头像
...
}
}