package com.netease.nim.uikit.common.media.picker.activity; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.text.TextUtils; import android.widget.Toast; import com.netease.nim.uikit.R; import com.netease.nim.uikit.common.activity.UI; import com.netease.nim.uikit.common.media.picker.model.PhotoInfo; import com.netease.nim.uikit.common.media.picker.model.PickerContract; import com.netease.nim.uikit.model.ToolBarOptions; import com.netease.nim.uikit.session.constant.Extras; import java.io.File; import java.util.List; public class PickImageActivity extends UI { private static final String KEY_STATE = "state"; public static final int FROM_LOCAL = 1; public static final int FROM_CAMERA = 2; private static final int REQUEST_CODE_CROP = 3; private static final int REQUEST_CODE_LOCAL = FROM_LOCAL; private static final int REQUEST_CODE_CAMERA = FROM_CAMERA; private boolean inited = false; public static void start(Activity activity, int requestCode, int from, String outPath) { Intent intent = new Intent(activity, PickImageActivity.class); intent.putExtra(Extras.EXTRA_FROM, from); intent.putExtra(Extras.EXTRA_FILE_PATH, outPath); activity.startActivityForResult(intent, requestCode); } public static void start(Activity activity, int requestCode, int from, String outPath, boolean mutiSelectMode, int multiSelectLimitSize, boolean isSupportOrig, boolean crop, int outputX, int outputY) { Intent intent = new Intent(activity, PickImageActivity.class); intent.putExtra(Extras.EXTRA_FROM, from); intent.putExtra(Extras.EXTRA_FILE_PATH, outPath); intent.putExtra(Extras.EXTRA_MUTI_SELECT_MODE, mutiSelectMode); intent.putExtra(Extras.EXTRA_MUTI_SELECT_SIZE_LIMIT, multiSelectLimitSize); intent.putExtra(Extras.EXTRA_SUPPORT_ORIGINAL, isSupportOrig); intent.putExtra(Extras.EXTRA_NEED_CROP, crop); intent.putExtra(Extras.EXTRA_OUTPUTX, outputX); intent.putExtra(Extras.EXTRA_OUTPUTY, outputY); activity.startActivityForResult(intent, requestCode); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.nim_pick_image_activity); ToolBarOptions options = new ToolBarOptions(); setToolBar(R.id.toolbar, options); } @Override protected void onResume() { super.onResume(); if (!inited) { processIntent(); inited = true; } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(KEY_STATE, inited); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if (savedInstanceState != null) { inited = savedInstanceState.getBoolean(KEY_STATE); } } private void processIntent() { int from = getIntent().getIntExtra(Extras.EXTRA_FROM, FROM_LOCAL); if (from == FROM_LOCAL) { pickFromLocal(); } else { pickFromCamera(); } } private void pickFromLocal() { Intent intent = pickIntent(); if (intent == null) { finish(); return; } try { startActivityForResult(intent, REQUEST_CODE_LOCAL); } catch (ActivityNotFoundException e) { Toast.makeText(this, R.string.gallery_invalid, Toast.LENGTH_LONG) .show(); finish(); } catch (Exception e) { Toast.makeText(this, R.string.sdcard_not_enough_head_error, Toast.LENGTH_LONG).show(); finish(); } } private void pickFromCamera() { try { String outPath = getIntent().getStringExtra(Extras.EXTRA_FILE_PATH); if (TextUtils.isEmpty(outPath)) { Toast.makeText(this, R.string.sdcard_not_enough_error, Toast.LENGTH_LONG).show(); finish(); return; } File outputFile = new File(outPath); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outputFile)); startActivityForResult(intent, REQUEST_CODE_CAMERA); } catch (ActivityNotFoundException e) { finish(); } catch (Exception e) { Toast.makeText(this, R.string.sdcard_not_enough_head_error, Toast.LENGTH_LONG).show(); finish(); } } private Intent pickIntent() { Intent intent = getIntent(); boolean mutiSelect = intent.getBooleanExtra(Extras.EXTRA_MUTI_SELECT_MODE, false); int mutiSelectLimitSize = intent.getIntExtra(Extras.EXTRA_MUTI_SELECT_SIZE_LIMIT, 9); boolean isSupportOrg = intent.getBooleanExtra(Extras.EXTRA_SUPPORT_ORIGINAL, false); return makeLaunchIntent(this, mutiSelect, mutiSelectLimitSize, isSupportOrg); } private Intent makeLaunchIntent(Context context, boolean mutiSelectMode, int mutiSelectLimitSize, boolean isSupportOrig) { Intent intent = new Intent(); intent.setClass(context, PickerAlbumActivity.class); intent.putExtra(Extras.EXTRA_MUTI_SELECT_MODE, mutiSelectMode); intent.putExtra(Extras.EXTRA_MUTI_SELECT_SIZE_LIMIT, mutiSelectLimitSize); intent.putExtra(Extras.EXTRA_SUPPORT_ORIGINAL, isSupportOrig); return intent; } private String pathFromResult(Intent data) { String outPath = getIntent().getStringExtra(Extras.EXTRA_FILE_PATH); if (data == null || data.getData() == null) { return outPath; } Uri uri = data.getData(); Cursor cursor = getContentResolver() .query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null); if (cursor == null) { // miui 2.3 有可能为null return uri.getPath(); } else { if (uri.toString().contains("content://com.android.providers.media.documents/document/image")) { // htc 某些手机 // 获取图片地址 String _id = null; String uridecode = uri.decode(uri.toString()); int id_index = uridecode.lastIndexOf(":"); _id = uridecode.substring(id_index + 1); Cursor mcursor = getContentResolver().query(Images.Media.EXTERNAL_CONTENT_URI, null, " _id = " + _id, null, null); mcursor.moveToFirst(); int column_index = mcursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); outPath = mcursor.getString(column_index); if (!mcursor.isClosed()) { mcursor.close(); } if (!cursor.isClosed()) { cursor.close(); } return outPath; } else { cursor.moveToFirst(); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); outPath = cursor.getString(column_index); if (!cursor.isClosed()) { cursor.close(); } return outPath; } } } private void onPickedLocal(Intent data, int code) { boolean mutiSelect = getIntent().getBooleanExtra(Extras.EXTRA_MUTI_SELECT_MODE, false); try { List<PhotoInfo> photos = PickerContract.getPhotos(data); if (photos != null && photos.size() >= 1) { PhotoInfo select = photos.get(0); String photoPath = select.getAbsolutePath(); boolean crop = getIntent().getBooleanExtra(Extras.EXTRA_NEED_CROP, false); if (crop) { crop(photoPath); } else { if (data != null) { Intent result = new Intent(data); result.putExtra(Extras.EXTRA_FROM_LOCAL, true); setResult(RESULT_OK, result); finish(); } } } } catch (Exception e) { Toast.makeText(this, R.string.picker_image_error, Toast.LENGTH_LONG).show(); finish(); } } private void onPickedCamera(Intent data, int code) { try { String photoPath = pathFromResult(data); boolean crop = getIntent().getBooleanExtra(Extras.EXTRA_NEED_CROP, false); if (crop) { crop(photoPath); } else { if (!TextUtils.isEmpty(photoPath)) { Intent result = new Intent(); result.putExtra(Extras.EXTRA_FROM_LOCAL, code == REQUEST_CODE_LOCAL); result.putExtra(Extras.EXTRA_FILE_PATH, photoPath); setResult(RESULT_OK, result); } finish(); } } catch (Exception e) { Toast.makeText(this, R.string.picker_image_error, Toast.LENGTH_LONG).show(); finish(); } } private void crop(String src) { Intent intent = getIntent(); int outputX = intent.getIntExtra(Extras.EXTRA_OUTPUTX, 0); int outputY = intent.getIntExtra(Extras.EXTRA_OUTPUTY, 0); String outPath = intent.getStringExtra(Extras.EXTRA_FILE_PATH); CropImageActivity.startForFile(this, src, outputX, outputY, outPath, REQUEST_CODE_CROP); } private void onCropped() { String outPath = getIntent().getStringExtra(Extras.EXTRA_FILE_PATH); Intent result = new Intent(); result.putExtra(Extras.EXTRA_FILE_PATH, outPath); setResult(RESULT_OK, result); finish(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) { setResult(resultCode); finish(); return; } switch (requestCode) { case REQUEST_CODE_LOCAL: onPickedLocal(data, requestCode); break; case REQUEST_CODE_CAMERA: onPickedCamera(data, requestCode); break; case REQUEST_CODE_CROP: onCropped(); break; default: break; } } }