在类似qq或者微信聊天中。如何根据不同的手机发送图片

原文:在类似qq或者微信聊天中。如何根据不同的手机发送图片

  前一段时间,公司自己要求做多客服开发,但是对于发送图片这一块,当时很苦恼,我用自己的手机(米2)测试,不管是本地,还是云相册,最新照片。都没有问题,但是测试那边一直说图片发不了,而且还会崩。很纳闷。

     后来经过debug,发现4.4以上的手机,它的图片路径居然不一样,有file://开头的,也有content://开头的,还有/mnt/sdcard/开头的,坑爹啊,我自己的手机是4.1的,不一样。

    4.4以前的路径都是Uri : content://media/extenral/images/***,我们在回的时候这样用就可以获取到路径。

   if (resultCode != RESULT_OK) {        //此处的 RESULT_OK 是系统自定义
        return;
    }

    Bitmap bm = null;
    //外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口
    ContentResolver resolver = getContentResolver();
    if (requestCode == IMAGE_CODE) {
        try {
            Uri originalUri = data.getData();        //获得图片的uri
            bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);        //显得到bitmap图片
这里开始的第二部分,获取图片的路径:
            String[] proj = {MediaStore.Images.Media.DATA};
            Cursor cursor = managedQuery(originalUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            //最后根据索引值获取图片路径
            String path = cursor.getString(column_index);
        }catch (IOException e) {
            Log.e(TAG,e.toString());
        }

    }

 4.4翻阅api 你就会发现,图片的路径边的不统一,采用原来的方法,有的图片就会发送不了,经过查找后发现以下这种方法完美解决了我的问题

   

public class GetPathUri4kitk {
    /**
     * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使
     */
    @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];
                }
                // TODO handle non-primary volumes
            }
            // 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 getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }

    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context
     *            The context.
     * @param uri
     *            The Uri to query.
     * @param selection
     *            (Optional) Filter used in the query.
     * @param selectionArgs
     *            (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    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 column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_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());
    }
}
时间: 2024-12-13 09:35:05

在类似qq或者微信聊天中。如何根据不同的手机发送图片的相关文章

查看图片插件--Viewer(类似于qq和微信聊天 的查看图片)

Viewer的github地址:https://github.com/fengyuanchen/viewer  下载该插件(在文件夹dist里面) 具有参考价值的几个网站:http://www.dowebok.com/demo/192/index3.html      http://www.szbelle.com/article/2890.html      http://www.jq22.com/jquery-info6536 Viewer的使用,参考:http://www.dowebok.c

ajax如何实现类似qq的在线聊天插件

ajax实现的无刷新在线聊天插件,效果极类似QQ聊天界面--在原来的基础上改造过的,网上还没有像这样实现的. 前段时间做了一个论坛,是phpwind源码的-5.0,后来从网上下了一个在线聊天插件,感觉不是很完善,就进行了改造.现在,我的论坛不在了(现在的网站是http://www.shou163.com/,欢迎设为首页),但是源码还留在硬盘上,想想应该能出来给大家共享,这样好的东西不能被埋没了,^-^ 实现的代码如下: 模板文件 index.htm 插入如下一段(注意先备份哦) <!-- 随便找

类似qq的IM聊天应用源码

这个是IM聊天应用源码,该应用IM支持实现XMPP,以及图片和表情,语音,消息回执等功能,基本覆盖了常见的im应用的功能了,大家可以参考一下吧. 源码下载:http://code.662p.com/view/7302.html<ignore_js_op><ignore_js_op><ignore_js_op><ignore_js_op><ignore_js_op> 详细说明:http://ios.662p.com/thread-1889-1-1.

微信开发中遇到的问题,关于cdnmidimgurl 图片获取

访问了微信服务器 返回的数据: [{MsgId=3349810483943419227, [email protected]@855c3ada0e9c387cfbcff93e9a1a639f024bcfd136f6273bcc575101df019960, [email protected]bc282eaece20, MsgType=3, [email protected]ca5139eb3:<br/><?xml version="1.0"?><br/&g

对QQ、微信等第三方登录的几个思考

转自:http://www.jianshu.com/p/7f282dfc16fc 今天聊聊注册.登录环节中很常见的第三方登录,如QQ.微信.支付宝.新浪微博等.虽然这些产品的开放平台都提供了标准的接入文档,但是在接入时还有些问题需要想清楚. 1 第三方登录目的 第三方登录的目的很简单,就是利用用户在其他平台上频繁使用的账号,来快速登录你的产品,达到不注册就登录的目的. 2 第三方登录好处 第三方登录的好处,显而易见. 不需要注册账号,直接使用已有的QQ号.微信等登录.减少了注册环节,减少了因为注

小程序版聊天室|聊天小程序|仿微信聊天界面小程序

仿微信聊天小程序weChatRoom案例,一款基于微信小程序开发的聊天室实战项目.很早之前就有开发过一个h5版聊天室,最近又在原先思路的基础上开发了个小程序版聊天室,功能效果非常接近微信聊天,实现了消息.表情发送,小程序表情解析,图片.视频上传预览,打赏.红包等微交互场景.整体界面风格及效果挺不错哒. ◆ 先睹为快 ◆ 项目中用到的弹窗插件,是自己开发的小程序弹窗组件wcPop: <!-- <>引入弹窗模板.Start --><import src="/utils/

AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)

代码地址:https://github.com/Luction/AndroidRichText AndroidRichText帮助实现像QQ,微信一样的,一个TextView里既有文字又有表情又有图片的效果,采用插件化的框架,代码简单,可拓展性强. 基础框架包只有四个java文件, RichTextWrapper :TextView的包裹类,实现支持富文本,通过new RichTextWrapper(TextView v)来构造. RTMovementMethod: 继承自Android原生的L

ASP.NET MVC应用程序中支持用户使用腾讯QQ和微信以及新浪微博的第三方登录

什么是第三方授权登录,就是一些大家都会有的帐号如QQ.微信.淘宝.微博等账户.通过那些巨头公司提供的api直接实现登录. 当然,我们是不可能得到你的用户名和密码的.不了解的人,可能会存在这个疑虑.我们可以通过第三方授权登录得到如昵称.性别.注册地址.年龄.头像等基本信息.当然,我们也可以得到你账户因为的唯一编码,就是OAuthId.什么是OAuth技术?大家自行了解,这里就不细讲了. 准备资料: 各平台相关授权appid以及appkey(新浪为App Secret) 申请地址: 新浪 申请入口

【iOS基础控件 - 11】【Demo】模仿qq ,微信 UI 聊天界面

A.需求 做出一个类似于QQ.微信的聊天界面 1.每个cell包含发送时间.发送人(头像).发送信息 2.使用对方头像放在左边,我方头像在右边 3.对方信息使用白色背景对话框,我方信息使用蓝色背景对话框 4.隐藏相同的发送时间 5.底部功能按钮:语音按钮.消息输入框.表情按钮.附加按钮 6.响应键盘事件,呼出键盘.隐藏键盘时对上述的视图作出上移操作 7.键盘的发送事件处理 Code Source: B.实现点 1.底层视图搭建 上部分聊天信息框:UITableView 下部分功能区:UIButt