web-dev-qa-db-ja.com

Android StudioでのSmack4.1とのXMPP接続

https://github.com/igniterealtime/Smack からSmack 4.1.0rc1を使用してXMPP接続を実行しようとしています。

私はこのガイドに従いました: https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide Gradleのインポート。

ソースコード:

package com.example.xmpp_app;

import Android.os.Bundle;
import Android.support.v7.app.ActionBarActivity;
import Android.view.Menu;
import Android.view.MenuItem;

import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;

import Java.io.IOException;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Create the configuration for this new connection
        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
        configBuilder.setUsernameAndPassword("[email protected]", "password123");
        configBuilder.setResource("test");
        configBuilder.setServiceName("example.com");

        AbstractXMPPConnection connection = new XMPPTCPConnection(configBuilder.build());
        // Connect to the server
        try {
            connection.connect();
        } catch (SmackException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMPPException e) {
            e.printStackTrace();
        }
        // Log into the server
        try {
            connection.login();
        } catch (XMPPException e) {
            e.printStackTrace();
        } catch (SmackException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Disconnect from the server
        connection.disconnect();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        maven {
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenCentral()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:1.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

gradleをビルドする:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.xmpp_app"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.Android.support:appcompat-v7:21.0.3'
    compile "org.igniterealtime.smack:smack-Java7:4.1.0-rc1"
    // Optional for XMPPTCPConnection
    compile "org.igniterealtime.smack:smack-tcp:4.1.0-rc1"
    // Optional for XMPP-IM (RFC 6121) support (Roster, Threaded Chats, …)
    compile "org.igniterealtime.smack:smack-im:4.1.0-rc1"
    // Optional for XMPP extensions support
    compile "org.igniterealtime.smack:smack-extensions:4.1.0-rc1"
}

エラー:

03-20 20:34:33.830    1005-1005/com.example.xmpp_app I/dalvikvm﹕ Could not find method Android.view.ViewGroup.onNestedScrollAccepted, referenced from method Android.support.v7.internal.widget.ActionBarOverlayLayout.onNestedScrollAccepted
03-20 20:34:33.830    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to resolve virtual method 11345: Landroid/view/ViewGroup;.onNestedScrollAccepted (Landroid/view/View;Landroid/view/View;I)V
03-20 20:34:33.850    1005-1005/com.example.xmpp_app D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000
03-20 20:34:33.850    1005-1005/com.example.xmpp_app I/dalvikvm﹕ Could not find method Android.view.ViewGroup.onStopNestedScroll, referenced from method Android.support.v7.internal.widget.ActionBarOverlayLayout.onStopNestedScroll
03-20 20:34:33.850    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to resolve virtual method 11351: Landroid/view/ViewGroup;.onStopNestedScroll (Landroid/view/View;)V
03-20 20:34:33.850    1005-1005/com.example.xmpp_app D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000
03-20 20:34:33.920    1005-1005/com.example.xmpp_app I/dalvikvm﹕ Could not find method Android.support.v7.internal.widget.ActionBarOverlayLayout.stopNestedScroll, referenced from method Android.support.v7.internal.widget.ActionBarOverlayLayout.setHideOnContentScrollEnabled
03-20 20:34:33.920    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to resolve virtual method 9039: Landroid/support/v7/internal/widget/ActionBarOverlayLayout;.stopNestedScroll ()V
03-20 20:34:33.950    1005-1005/com.example.xmpp_app D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x000e
03-20 20:34:34.100    1005-1005/com.example.xmpp_app I/dalvikvm﹕ Could not find method Android.content.res.TypedArray.getChangingConfigurations, referenced from method Android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
03-20 20:34:34.110    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to resolve virtual method 364: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
03-20 20:34:34.110    1005-1005/com.example.xmpp_app D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
03-20 20:34:34.150    1005-1005/com.example.xmpp_app I/dalvikvm﹕ Could not find method Android.content.res.TypedArray.getType, referenced from method Android.support.v7.internal.widget.TintTypedArray.getType
03-20 20:34:34.150    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to resolve virtual method 386: Landroid/content/res/TypedArray;.getType (I)I
03-20 20:34:34.150    1005-1005/com.example.xmpp_app D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
03-20 20:34:35.790    1005-1005/com.example.xmpp_app D/dalvikvm﹕ GC_FOR_ALLOC freed 221K, 9% free 3164K/3452K, paused 105ms, total 115ms
03-20 20:34:38.420    1005-1005/com.example.xmpp_app D/dalvikvm﹕ GC_FOR_ALLOC freed 295K, 10% free 3382K/3744K, paused 90ms, total 93ms
03-20 20:34:40.250    1005-1005/com.example.xmpp_app D/dalvikvm﹕ GC_FOR_ALLOC freed 349K, 11% free 3531K/3952K, paused 80ms, total 85ms
03-20 20:34:40.310    1005-1005/com.example.xmpp_app E/dalvikvm﹕ Could not find class 'javax.naming.directory.InitialDirContext', referenced from method org.jivesoftware.smack.util.dns.javax.JavaxResolver.<clinit>
03-20 20:34:40.310    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to resolve new-instance 1688 (Ljavax/naming/directory/InitialDirContext;) in Lorg/jivesoftware/smack/util/dns/javax/JavaxResolver;
03-20 20:34:40.320    1005-1005/com.example.xmpp_app D/dalvikvm﹕ VFY: replacing opcode 0x22 at 0x000c
03-20 20:34:40.360    1005-1005/com.example.xmpp_app I/dalvikvm﹕ Could not find method javax.naming.directory.DirContext.getAttributes, referenced from method org.jivesoftware.smack.util.dns.javax.JavaxResolver.lookupSRVRecords
03-20 20:34:40.360    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to resolve interface method 12701: Ljavax/naming/directory/DirContext;.getAttributes (Ljava/lang/String;[Ljava/lang/String;)Ljavax/naming/directory/Attributes;
03-20 20:34:40.370    1005-1005/com.example.xmpp_app D/dalvikvm﹕ VFY: replacing opcode 0x72 at 0x0011
03-20 20:34:40.370    1005-1005/com.example.xmpp_app D/dalvikvm﹕ DexOpt: unable to opt direct call 0x319e at 0x0e in Lorg/jivesoftware/smack/util/dns/javax/JavaxResolver;.<clinit>
03-20 20:34:40.410    1005-1005/com.example.xmpp_app W/dalvikvm﹕ Exception Ljava/lang/NoClassDefFoundError; thrown while initializing Lorg/jivesoftware/smack/util/dns/javax/JavaxResolver;
03-20 20:34:41.330    1005-1005/com.example.xmpp_app I/dalvikvm﹕ Could not find method javax.security.sasl.Sasl.createSaslClient, referenced from method org.jivesoftware.smack.sasl.javax.SASLJavaXMechanism.authenticateInternal
03-20 20:34:41.330    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to resolve static method 12731: Ljavax/security/sasl/Sasl;.createSaslClient ([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljavax/security/auth/callback/CallbackHandler;)Ljavax/security/sasl/SaslClient;
03-20 20:34:41.340    1005-1005/com.example.xmpp_app D/dalvikvm﹕ VFY: replacing opcode 0x77 at 0x001a
03-20 20:34:41.340    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to resolve exception class 1708 (Ljavax/security/sasl/SaslException;)
03-20 20:34:41.350    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY: unable to find exception handler at addr 0x21
03-20 20:34:41.350    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY:  rejected Lorg/jivesoftware/smack/sasl/javax/SASLJavaXMechanism;.authenticateInternal ()V
03-20 20:34:41.350    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY:  rejecting opcode 0x0d at 0x0021
03-20 20:34:41.350    1005-1005/com.example.xmpp_app W/dalvikvm﹕ VFY:  rejected Lorg/jivesoftware/smack/sasl/javax/SASLJavaXMechanism;.authenticateInternal ()V
03-20 20:34:41.350    1005-1005/com.example.xmpp_app W/dalvikvm﹕ Verifier rejected class Lorg/jivesoftware/smack/sasl/javax/SASLJavaXMechanism;
03-20 20:34:41.370    1005-1005/com.example.xmpp_app W/dalvikvm﹕ Exception Ljava/lang/VerifyError; thrown while initializing Lorg/jivesoftware/smack/SmackInitialization;
03-20 20:34:41.370    1005-1005/com.example.xmpp_app W/dalvikvm﹕ Exception Ljava/lang/VerifyError; thrown while initializing Lorg/jivesoftware/smack/ConnectionConfiguration;
03-20 20:34:41.380    1005-1005/com.example.xmpp_app D/AndroidRuntime﹕ Shutting down VM
03-20 20:34:41.380    1005-1005/com.example.xmpp_app W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb1a3bba8)
03-20 20:34:41.540    1005-1005/com.example.xmpp_app D/dalvikvm﹕ GC_FOR_ALLOC freed 438K, 14% free 3576K/4112K, paused 59ms, total 64ms
03-20 20:34:41.580    1005-1005/com.example.xmpp_app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.xmpp_app, PID: 1005
    Java.lang.VerifyError: org/jivesoftware/smack/sasl/javax/SASLJavaXMechanism
            at org.jivesoftware.smack.sasl.javax.SASLJavaXSmackInitializer.initialize(SASLJavaXSmackInitializer.Java:28)
            at org.jivesoftware.smack.SmackInitialization.loadSmackClass(SmackInitialization.Java:232)
            at org.jivesoftware.smack.SmackInitialization.parseClassesToLoad(SmackInitialization.Java:193)
            at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.Java:163)
            at org.jivesoftware.smack.SmackInitialization.processConfigFile(SmackInitialization.Java:148)
            at org.jivesoftware.smack.SmackInitialization.<clinit>(SmackInitialization.Java:116)
            at org.jivesoftware.smack.SmackConfiguration.getVersion(SmackConfiguration.Java:96)
            at org.jivesoftware.smack.ConnectionConfiguration.<clinit>(ConnectionConfiguration.Java:38)
            at com.example.xmpp_app.MainActivity.onCreate(MainActivity.Java:29)
            at Android.app.Activity.performCreate(Activity.Java:5231)
            at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1087)
            at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2159)
            at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2245)
            at Android.app.ActivityThread.access$800(ActivityThread.Java:135)
            at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1196)
            at Android.os.Handler.dispatchMessage(Handler.Java:102)
            at Android.os.Looper.loop(Looper.Java:136)
            at Android.app.ActivityThread.main(ActivityThread.Java:5017)
            at Java.lang.reflect.Method.invokeNative(Native Method)
            at Java.lang.reflect.Method.invoke(Method.Java:515)
            at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:779)
            at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:595)
            at dalvik.system.NativeStart.main(Native Method)
03-20 20:39:44.485    1005-1005/com.example.xmpp_app I/Process﹕ Sending signal. PID: 1005 SIG: 9

誰かがこの問題で私を助けてくれませんか?接続が機能するかどうかを確認しようとしています。

10
kobbycoder

Build.gradleでsmack-Java7smack-Androidに置き換えます。これは SmackのREADME に記載されています。

14
Flow

これは、私の最後のFCMXMPP接続サーバーアプリケーションのアップグレードです。現在、このプロジェクトでは、現時点で最新バージョンのSmackライブラリ(4.1.8)を使用しています。 AndroidのライブラリはJavaサーバーの場合とほとんど同じだと思います。

https://github.com/carlosCharz/fcmxmppserverv2

これは私のサンプルJava Firebase Cloud Messaging(FCM)XMPP接続サーバーを紹介するプロジェクトです。このサーバーはXMPPプロトコルを使用してFCMCCSサーバー経由でクライアントアプリにデータを送信します。

https://github.com/carlosCharz/fcmxmppserver

また、変更点を説明するビデオをYouTubeで作成しました。

https://www.youtube.com/watch?v=KVKEj6PeLTc

お役に立てば幸いです。

実装のコードスニペットは次のとおりです。

    public class CcsClient implements StanzaListener {

    //Other code

    public void connect() throws XMPPException, SmackException, IOException {
    XMPPTCPConnection.setUseStreamManagementResumptionDefault(true);
    XMPPTCPConnection.setUseStreamManagementDefault(true);

    XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();
    config.setServiceName("FCM XMPP Client Connection Server");
    config.setHost(Util.FCM_SERVER);
    config.setPort(Util.FCM_PORT);
    config.setSecurityMode(SecurityMode.ifpossible);
    config.setSendPresence(false);
    config.setSocketFactory(SSLSocketFactory.getDefault());
    // Launch a window with info about packets sent and received
    config.setDebuggerEnabled(mDebuggable);

    // Create the connection
    connection = new XMPPTCPConnection(config.build());

    // Connect
    connection.connect();

    // Enable automatic reconnection
    ReconnectionManager.getInstanceFor(connection).enableAutomaticReconnection();

    // Handle reconnection and connection errors
    connection.addConnectionListener(new ConnectionListener() {

        @Override
        public void reconnectionSuccessful() {
            logger.log(Level.INFO, "Reconnection successful ...");
            // TODO: handle the reconnecting successful
        }

        @Override
        public void reconnectionFailed(Exception e) {
            logger.log(Level.INFO, "Reconnection failed: ", 
        e.getMessage());
            // TODO: handle the reconnection failed
        }

        @Override
        public void reconnectingIn(int seconds) {
            logger.log(Level.INFO, "Reconnecting in %d secs", seconds);
            // TODO: handle the reconnecting in
        }

        @Override
        public void connectionClosedOnError(Exception e) {
            logger.log(Level.INFO, "Connection closed on error");
            // TODO: handle the connection closed on error
        }

        @Override
        public void connectionClosed() {
            logger.log(Level.INFO, "Connection closed");
            // TODO: handle the connection closed
        }

        @Override
        public void authenticated(XMPPConnection arg0, boolean arg1) {
            logger.log(Level.INFO, "User authenticated");
            // TODO: handle the authentication
        }

        @Override
        public void connected(XMPPConnection arg0) {
            logger.log(Level.INFO, "Connection established");
            // TODO: handle the connection
        }
    });

    // Handle incoming packets (the class implements the StanzaListener)
    connection.addAsyncStanzaListener(this,
            stanza -> stanza.hasExtension(Util.FCM_ELEMENT_NAME, Util.FCM_NAMESPACE));

    // Log all outgoing packets
    connection.addPacketInterceptor(stanza -> logger.log(Level.INFO, 
    "Sent: {}", stanza.toXML()), stanza -> true);

    connection.login(fcmServerUsername, mApiKey);
    logger.log(Level.INFO, "Logged in: " + fcmServerUsername);
    }
  }

サーバーをXMPPConnectionクラスに接続してみてください。

接続方法:

XMPPConnection con = new XMPPTCPConnection("igniterealtime.org");
con.connect();
0
Santosh