android即时消息应用程序[关闭]

Posted

技术标签:

【中文标题】android即时消息应用程序[关闭]【英文标题】:android instant message application [closed] 【发布时间】:2015-12-16 04:09:28 【问题描述】:

我对 android 很陌生,但我真的很想构建一些东西,我真的需要一些关于我应该如何以及应该研究什么的建议。

它基本上是一个安卓即时消息应用程序,它是一个只适用于 2 人的应用程序。人 A 和人 B,他们将不得不以某种方式连接到彼此的手机(我假设使用一些唯一的 ID?),并且他们的手机上会有一个小部件。当A人按下按钮时,B人将收到一条随机消息,该消息会在B人的手机上弹出,并且在B人的手机上也会振动。当 B 再次按下它作为回复时,它会对 A 的手机执行相同的操作。

我应该为这种应用寻找什么样的库或概念?

谢谢

【问题讨论】:

感谢您的建议,我想知道连接黑白 2 手机的最佳方式是什么 【参考方案1】:

https://thinkandroid.wordpress.com/2010/03/27/incorporating-socket-programming-into-your-applications/

这个想法涉及到 Socket 编程,基本上让一部手机成为“服务器”,另一部手机成为“客户端”。现在,我不知道这是否是让两部手机相互通信的标准做法,但它在我一直在开发的一个新应用程序中对我有用,所以它是: 公共类 ServerActivity 扩展 Activity

private TextView serverStatus;

// DEFAULT IP
public static String SERVERIP = "10.0.2.15";

// DESIGNATE A PORT
public static final int SERVERPORT = 8080;

private Handler handler = new Handler();

private ServerSocket serverSocket;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.server);
    serverStatus = (TextView) findViewById(R.id.server_status);

    SERVERIP = getLocalIpAddress();

    Thread fst = new Thread(new ServerThread());
    fst.start();


public class ServerThread implements Runnable 

    public void run() 
        try 
            if (SERVERIP != null) 
                handler.post(new Runnable() 
                    @Override
                    public void run() 
                        serverStatus.setText("Listening on IP: " + SERVERIP);
                    
                );
                serverSocket = new ServerSocket(SERVERPORT);
                while (true) 
                    // LISTEN FOR INCOMING CLIENTS
                    Socket client = serverSocket.accept();
                    handler.post(new Runnable() 
                        @Override
                        public void run() 
                            serverStatus.setText("Connected.");
                        
                    );

                    try 
                        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                        String line = null;
                        while ((line = in.readLine()) != null) 
                            Log.d("ServerActivity", line);
                            handler.post(new Runnable() 
                                @Override
                                public void run() 
                                    // DO WHATEVER YOU WANT TO THE FRONT END
                                    // THIS IS WHERE YOU CAN BE CREATIVE
                                
                            );
                        
                        break;
                     catch (Exception e) 
                        handler.post(new Runnable() 
                            @Override
                            public void run() 
                                serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones.");
                            
                        );
                        e.printStackTrace();
                    
                
             else 
                handler.post(new Runnable() 
                    @Override
                    public void run() 
                        serverStatus.setText("Couldn't detect internet connection.");
                    
                );
            
         catch (Exception e) 
            handler.post(new Runnable() 
                @Override
                public void run() 
                    serverStatus.setText("Error");
                
            );
            e.printStackTrace();
        
    


// GETS THE IP ADDRESS OF YOUR PHONE'S NETWORK
private String getLocalIpAddress() 
    try 
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) 
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) 
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress())  return inetAddress.getHostAddress().toString(); 
            
        
     catch (SocketException ex) 
        Log.e("ServerActivity", ex.toString());
    
    return null;


@Override
protected void onStop() 
    super.onStop();
    try 
         // MAKE SURE YOU CLOSE THE SOCKET UPON EXITING
         serverSocket.close();
      catch (IOException e) 
         e.printStackTrace();
     



您将拥有一个客户端和一个服务器。服务器发送给客户端。因为两部手机都在互相发送,所以客户端和服务器会不断切换。您也可以尝试使用蓝牙实现:

android bluetooth implementation basics

有很多方法可以建立网络,您应该研究一下。但是,要像您所说的那样振动手机,只需使用以下代码:

import android.os.Vibrator;
 ...
 Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE);
 // Vibrate for 500 milliseconds
 v.vibrate(500);

并且您将需要在清单中获得此权限:

<uses-permission android:name="android.permission.VIBRATE"/>

如果这有帮助,请告诉我!

:-)

【讨论】:

非常感谢您提供的信息,有时我会花时间解决所有这些问题,如果您的代码有任何问题,我会告诉您。谢谢【参考方案2】:

您可以实施移动云来做到这一点。例如:谷歌云消息、解析、... 这些是替换网络服务器来接收消息,处理它们并发送给其他人。 我推荐使用 Parse:https://parse.com/(使用推送通知功能)。它还支持Geopoint,存储文件,发送消息,...

【讨论】:

parse 看起来很酷,我需要一些时间来一一阅读,但感谢您的建议

以上是关于android即时消息应用程序[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Sinch - 即时消息 - 应用关闭时收到推送通知

Windows 8 商店即时消息应用程序 [关闭]

Firebase 消息在现代 Android 即时应用程序中不起作用 - DisplayNotificationRequired?

Android消息推送能推送图片吗?还是只能推送文字信息?

实现iOS端即时通讯开发的高性能消息推送

有没有基于 Openfire 的即时消息教程?