参考CSDN上的文章
Android 自定义可编辑图文混排EditText
由于本文作者对如何获取本地图片没有提及,所以参考另一个内容
调用系统相机进行拍照并保存
此处着实让我花了大把时间,教程里和网上获取照片的实例都没法使用,后面发现了这篇文章,在api19(Android 4.4 KitKat)后,选取图片不像之前的版本一样直接返回真正的uri,还有另一种情况是 返回封装过的uri,因此如果是4.4版本以上的手机就需要判断返回的uri是否是封装的uri,如果是就需要对这个Uri进行解析才行
从最近、图片、下载内容中选取照片时返回的Uri是封装的Uri,我们必须进行解析
从图库、文件管理中选取照片时返回的Uri是图片真正的Uri,我们不需要解析
主要布局就是
<ScrollView
<LinearLayout
<edu.fjnu.birdie.imageedittext.PictureAndTextEditorView
/LinearLayout>
</ScrollView>
通过ScrollView使页面支持滚动
PictureAndTextEditorView继承EditView的文本操作,并实现了图片的显示
具体的原作者写的比较清楚,可以参考上方的连接,后续我对这个内容理解后,会 写出自己继承EditView的图片显示类,到时在展开来讲
<edu.fjnu.birdie.imageedittext.PictureAndTextEditorView
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scrollbars="vertical"
android:scrollbarStyle="outsideOverlay"
android:gravity="start"
android:hint="输入内容"
android:background="@null"
/>
此处 android:scrollbars设置了滚动条模式为垂直滚动条
并用 android:scrollbarStyle表示滚动条在padding区域外并且覆盖在view上
惯例使用了android:background=”@null”取消输入栏的下划线
选取本地图片
public void selectPicFromLocal
(Context mContext, int LOCAL_IMAGE_CODE) {
Intent intent = new Intent();
intent.setType(IMAGE_TYPE); //IMAGE_TYPE = "image/*"; intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, LOCAL_IMAGE_CODE);}
setType属性来选择内容的格式
setAction(Intent.ACTION_GET_CONTENT); 调用系统程序来打开选择的内容
选取本地图片并返回LOCAL_IMAGE_CODE提供给 onActivityResult()使用
intent.setType(“image/*”); //选择图片
intent.setType(“audio/*”); //选择音频
intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
intent.setType(“video/*;image/*”);//同时选择视频和图片
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case LOCAL_IMAGE_CODE:
if (data != null) {
if(resultCode == RESULT_OK)
{
if(Build.VERSION.SDK_INT >= 19){
handleImageOnKitKat(data);
}else{
handleImageBeforeKitKat(data);
}
}
}
break;
default:
break;
}
}
}
结果码匹配得到数据是来自本地照片的,根据之前所说的在4.4前后的照片读取的返回地址不同了,所以判断版本后,处理Intent传来的数据并转化为所需的图片真实uri
根据Intent传来的数据获得图片真实地址
private String getImagePath(Uri uri, String selection) {
String path = null;
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
4.4之前的版本相对简单
public void handleImageBeforeKitKat(Intent data){
Uri uri = data.getData();
String imagePath = getImagePath(uri, null);
Log.d("Uri1",imagePath);
mEditText.insertBitmap(imagePath);
}
4.4之后
public void handleImageOnKitKat(Intent data){
String imagePath = null;
Uri uri = data.getData();
if(DocumentsContract.isDocumentUri(this,uri)){
String docId = DocumentsContract.getDocumentId(uri);
if("com.android.providers.media.documents".equals(uri.getAuthority())){
//解析出数字格式的ID
String id = docId.split(":")[1];
//获取相册路径
String selection = MediaStore.Images.Media._ID +"=" + id;
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
}else if("com.android.providers.downloads.documents".equals(uri.getAuthority()))
{
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://download/public_downloads"),Long.valueOf(docId));
imagePath = getImagePath(contentUri,null);
}
}else if("content".equalsIgnoreCase(uri.getScheme()))
{
imagePath = getImagePath(uri,null);
Log.d("Uri1",imagePath);
}
mEditText.insertBitmap(imagePath);
}
如果是document类型的Uri,则通过document id处理
如果不是document类型的Uri,则使用普通方式处理
mEditText.insertBitmap(imagePath);这个函数是为了给 PictureAndTextEditorView中提供图片地址
作者:蔡晓淼
链接:EditText插入图片