EditText插入图片

​ 参考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插入图片

你可能感兴趣的:(EditText插入图片)