Java 如何让Android在局域网上唤醒?

Java 如何让Android在局域网上唤醒?,java,android,eclipse,wake-on-lan,Java,Android,Eclipse,Wake On Lan,你能告诉我,如何为Android制作局域网唤醒应用程序吗?我在谷歌上搜索了两周,尝试了一切,从另一个wake on lan应用程序下载了源代码,并试图找到制作和发送魔法包的代码。它看起来像所有其他代码都能工作,但当我在我的应用程序中使用它时,它就不工作了!我还尝试编辑java代码,使其适用于Android(如下:)。你能帮帮我吗? 对不起,我的英语不好。 这是我的代码: package com.macura.wakemypc; import java.net.DatagramPacket; i

你能告诉我,如何为Android制作局域网唤醒应用程序吗?我在谷歌上搜索了两周,尝试了一切,从另一个wake on lan应用程序下载了源代码,并试图找到制作和发送魔法包的代码。它看起来像所有其他代码都能工作,但当我在我的应用程序中使用它时,它就不工作了!我还尝试编辑java代码,使其适用于Android(如下:)。你能帮帮我吗? 对不起,我的英语不好。 这是我的代码:

package com.macura.wakemypc;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import com.macura.wakemypc.MainActivity;

import com.macura.wakemypc.R;
import com.macura.wakemypc.MainActivity;

import com.macura.wakemypc.MainActivity;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {
public static final int PORT = 9; 





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

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
 }
 public void buttonClick(View view) {
EditText iptext = (EditText)findViewById(R.id.ipbox);
EditText mactext = (EditText)findViewById(R.id.macbox);
String broadcastIP = String.valueOf(iptext.getText());
String mac = String.valueOf(mactext.getText());
Log.d("Read mac= ", mac);
Log.d("Read ip=", broadcastIP);
MainActivity.wakeup(broadcastIP, mac);
  }
 private static byte[] getMacBytes(String mac) throws IllegalArgumentException {
     Log.d("GetMacBytes", "method started");
// TODO Auto-generated method stub
byte[] bytes = new byte[6];
try {
    String hex;
    for (int i = 0; i < 6; i++) {
        hex = mac.substring(i*2, i*2+2);
        bytes[i] = (byte) Integer.parseInt(hex, 16);
        Log.d("GetMacbytes", "calculated");
        Log.d("GetMacBytes (bytes)", new String(bytes));
    }
}
catch (NumberFormatException e) {
    Log.e("GetMacBytes","error");
}
return bytes;
 }

 public static void wakeup(String broadcastIP, String mac) {
     Log.d("wakeup", "method started");
if (mac == null) {
    Log.d("Mac error at wakeup", "mac = null");
    return;
}

    try {
        byte[] macBytes = getMacBytes(mac);
        Log.d("wakeup (bytes)", new String(macBytes));
        byte[] bytes = new byte[6 + 16 * macBytes.length];
        for (int i = 0; i < 6; i++) {
            bytes[i] = (byte) 0xff;
        }
        for (int i = 6; i < bytes.length; i += macBytes.length) {
            System.arraycopy(macBytes, 0, bytes, i, macBytes.length);
        }

        Log.d("wakeup", "calculating completed, sending...");
        InetAddress address = InetAddress.getByName(broadcastIP);
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 9);
        DatagramSocket socket = new DatagramSocket();
        socket.send(packet);
        socket.close();
        Log.d("wakeup", "Magic Packet sent");



         }
         catch (Exception e) {
             Log.e("wakeup", "error");
     }

 }

 }

如果没有关于你的应用程序的更多细节,你可能想尝试的是GCM。您设置为接收GCM消息,然后发送GCM消息,这将负责唤醒设备,对于您试图实现的任何目的来说,这可能同样足够。

看起来您使用了错误的方法从
编辑文本(toString)
,,您必须在高于3的Android版本上使用
gettext

。如果你在主线程中,你就不能进行联网,在你的情况下,主线程就是MainActivity!只需在线程内部调用函数:

new Thread(new Runnable() {
    public void run() {
        wakeup(broadcastIP, mac);
    }
}).start();

如果你不知道线程是什么,请阅读这篇关于

的文章,在这里发布你的代码,这样我们就可以看到你想要什么和你已经拥有什么了好的,已经发布了,请让我知道,如果它错了:)我在安卓开发者身上发现了一些关于GCM的东西,看起来GCM是用来唤醒安卓设备的,但我需要唤醒PC。好的,这行吗?:String mac=mactext.getText().toString().trim();这样行吗?因为它不工作:String mac=mactext.getText().toString();使用字符串mac=String.valueOf(mactext.getText());我试过了(也更新了上面的代码),但仍然不起作用:(我的电脑上已经启用了局域网唤醒功能,谷歌Play的应用程序也在运行。上面的代码来自这个网站:,我只是编辑了它,使它能在安卓系统上运行
new Thread(new Runnable() {
    public void run() {
        wakeup(broadcastIP, mac);
    }
}).start();