本文是在上一篇博文Android基于XMPP的即时通讯1-基本对话的基础上,添加新的功能,文件传输

1、初始化文件传输管理类

public static FileTransferManager getFileTransferManager() {
    if (fileManager == null) {
        ServiceDiscoveryManager sdManager = ServiceDiscoveryManager
                .getInstanceFor(connection);
        if (sdManager == null) {
            sdManager = new ServiceDiscoveryManager(connection);
        }
        sdManager.addFeature("http://jabber.org/protocol/disco#info");
        sdManager.addFeature("jabber:iq:privacy");
        FileTransferNegotiator.setServiceEnabled(connection, true);
        fileManager = new FileTransferManager(connection);
    }
    return fileManager;
}

2、监听接收文件(文件路径创建好,不然会报错),直接接收文件,没有写确认

private void addFileListerer() {
    FileTransferManager manager = XmppConnection.getFileTransferManager();
    manager.addFileTransferListener(new FileTransferListener() {
        @Override
        public void fileTransferRequest(final FileTransferRequest request) {
            new Thread() {
                @Override
                public void run() {
                    IncomingFileTransfer transfer = request.accept();
                    String fileName = transfer.getFileName();
                    // 在handler里取出来显示消息
                    String[] args = new String[] { toUserName, fileName };
                    android.os.Message msg = handler.obtainMessage();
                    msg.what = 1;
                    msg.obj = args;
                    msg.sendToTarget();

                    String save_path = Environment
                            .getExternalStorageDirectory()
                            + File.separator
                            + "XmppTest"
                            + File.separator
                            + fileName;
                    File file = new File(save_path);
                    try {
                        transfer.recieveFile(file);
                        while (!transfer.isDone()) {
                            if (transfer.getStatus().equals(FileTransfer.Status.error)) {
                                System.out.println("ERROR!!! " + transfer.getError());
                            } else {
                            }
                            try {
                                Thread.sleep(1000L);
                            } catch (Exception e) {
                            }
                        }
                    } catch (XMPPException e) {
                        e.printStackTrace();
                    }
                };
            }.start();
        }
    });
}

3、发送文件,这里发送图片测试

客户端文件发送:toId后边要加一个字符串"/Smack",发送给其他的平台要加相应的字符串;

这里手机客户端发送给Spark客户端,发送文件时toId+"/Spark"

private void getImage(){
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent, TUPIAN_RESULT);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Uri uri = data.getData();
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = activity.managedQuery(uri, proj, null, null, null);
    int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String img_path = cursor.getString(index);
    new SendFileTask().execute(img_path, toUserID);
};
class SendFileTask extends AsyncTask<String, Integer, Integer> {
    protected Integer doInBackground(String... params) {
        if (params.length < 2) {
            return Integer.valueOf(-1);
        }
        String img_path = params[0];
        String toId = params[1] + "/Spark";

        FileTransferManager fileTransferManager = XmppConnection.getFileTransferManager();
        File filetosend = new File(img_path);
        if (filetosend.exists() == false) {
            return -1;
        }
        // 在handler里取出来显示消息
        String[] args = new String[] { toUserName, img_path };
        android.os.Message msg = handler.obtainMessage();
        msg.what = 1;
        msg.obj = args;
        msg.sendToTarget();

        OutgoingFileTransfer transfer = fileTransferManager
                .createOutgoingFileTransfer(toId);// 创建一个输出文件传输对象
        try {
            transfer.sendFile(filetosend, "recv img");
            while (!transfer.isDone()) {
                if (transfer.getStatus().equals(FileTransfer.Status.error)) {
                    System.out.println("ERROR!!! " + transfer.getError());
                } else {
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } catch (XMPPException e1) {
            e1.printStackTrace();
        }
        return 0;
    }
}

源码送上:http://files.cnblogs.com/files/pear-lemon/XmppTest.zip

Android基于XMPP的即时通讯2-文件传输的更多相关文章

  1. Android基于XMPP的即时通讯3-表情发送

    这篇博文主要讲表情发送的一些东西. 参考:Android基于XMPP的即时通讯1-基本对话 1.准备好资源文件 采用的是emoji的表情,我打包好了,下载地址:http://files.cnblogs ...

  2. Android基于xmpp的即时通讯应用

    xmpp是一个通信协议.因为这是个开放的协议,为了节俭开发成本,很多即时应用都采用了这个协议.Android上最常用的组合asmack +openfire.Asmack是smack的android版, ...

  3. Android基于XMPP的即时通讯1-基本对话

    闲暇之余,自己写了个简单的即时通讯,基于OpenFire服务器平台. 整个项目包括两个部分,一个是服务器端,一个是android手机端: 一.关于服务器端没什么好说的,下载安装配置即可 推荐下载带ja ...

  4. 【XMPP】基于XMPP的即时通讯解决方案

    什么是XMPP 介绍XMPP之前,先来看看GTalk. GTalk是Google推出的IM(Instant Messaging,即时通讯)软件,类似于QQ和MSN. 从技术角度来说,GTalk与QQ和 ...

  5. iOS基于XMPP实现即时通讯之一、环境的搭建

    移动端访问不佳,请访问我的个人博客 使用XMPP已经有一段时间了,但是一直都没深入研究过,只是使用SDK做一些简单的操作,看了许多大神的博客,自己总结一下,准备写一系列关于XMPP的使用博客,以便于自 ...

  6. Android基于XMPP Smack openfire 开发的聊天室

    Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...

  7. ZT android -- 蓝牙 bluetooth (四)OPP文件传输

    android -- 蓝牙 bluetooth (四)OPP文件传输 分类: Android的原生应用分析 2013-06-22 21:51 2599人阅读 评论(19) 收藏 举报 4.2源码AND ...

  8. android环境下的即时通讯

    首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...

  9. 基于openfire+smack即时通讯instant message开发

    前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire 是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使 ...

随机推荐

  1. SQL简繁转换函数

    declare @jall nvarchar(4000),@fall nvarchar(4000) select @jall=N'啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊 ...

  2. 【jackson 异常】com.fasterxml.jackson.databind.JsonMappingException异常处理

    项目中,父层是Gene.java[基因实体]  子层是Corlib.java[文集库实体],一种基因对用多个文集库文章 但是在查询文集库这个实体的时候报错:[com.fasterxml.jackson ...

  3. Nginx支持多站点配置小结

    如何配置 web 服务器才能在一个 VPS 上放置多个网站/博客呢?如何通过一个 IP 访问多个站点/域名呢?这是大多数 web 服务器支持的 virtual hosting 功能.即一个IP对应多个 ...

  4. CLR 初步

    1. 源代码编译为托管模块 程序在.NET框架下运行,首先要将源代码编译为 托管模块.CLR是一个可以被多种语言所使用的运行时,它的很多特性可以用于所有面向它的开发语言.微软开发了多种语言的编译器,编 ...

  5. windows加入path路径

    右键我的电脑,属性:高级系统设置,高级,环境变量:在系统变量中选path,编辑:将python安装路径加入即可(注意分号):

  6. 廖雪峰js教程笔记8 date对象介绍和处理

    在JavaScript中,Date对象用来表示日期和时间. 要获取系统当前时间,用: var now = new Date(); now; // Wed Jun 24 2015 19:49:22 GM ...

  7. SPOJ SUBST1 后缀数组

    题目链接:http://www.spoj.com/problems/SUBST1/en/ 题意:给定一个字符串,求不相同的子串个数. 思路:直接根据09年oi论文<<后缀数组——出来字符串 ...

  8. SQL初级

    SQL是一个微软开发的数据库,因为联系到很多内部服务程序和文件所以安装和删除的时候有些人会遇上些麻烦,如果安装失败了那就得完全删除后重装,然而他自己自带的删除系统并不是那么给力,所以悲剧就诞生了,不行 ...

  9. DuckHunter Attacks

    DuckHunter Attacks   DuckHunter Attacks是从USB Rubber Ducky (USB橡皮鸭)发展过来的HID攻击方式.USB Rubber Ducky是从201 ...

  10. Swift3.0语言教程字符串与URL的数据转换与自由转换

    Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...