GVKun编程网logo

android – UDP数据包(通过WiFi Direct)永远不会到达(android udp通信)

18

如果您对android–UDP数据包(通过WiFiDirect)永远不会到达和androidudp通信感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解android–UDP数据包(通过WiFiD

如果您对android – UDP数据包(通过WiFi Direct)永远不会到达android udp通信感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解android – UDP数据包(通过WiFi Direct)永远不会到达的各种细节,并对android udp通信进行深入的分析,此外还有关于Android Studio永远不会完成将应用程序上传到Nexus 10、Android Wear将数据发送到Android手机,但手机似乎永远不会收到它、Android WiFi Direct – 连接没有提示?、android – AsyncTask线程永远不会死的实用技巧。

本文目录一览:

android – UDP数据包(通过WiFi Direct)永远不会到达(android udp通信)

android – UDP数据包(通过WiFi Direct)永远不会到达(android udp通信)

那些阅读我之前的问题的人可能已经知道这一点:我目前正试图抓住整个WiFi Direct的东西.到目前为止我所做的就是创建连接.
我想要做的是通过UDP将数据包发送到groupOwner(其IP当然是已知的) – 但它似乎每次都迷失方向.

这是我的一些代码,我有一个接收文件的服务和一个在后台提交它们的intentservice:

FileReceiverService.java

    @Override
    public void run() {
        Log.d(TAG, "Thread starting...");
        try {
            app.log("opening UDP socket to receive files.");
            DatagramSocket socket = new DatagramSocket(PORT);
            app.log("Socket open!");
            socket.setSoTimeout(5000);
            app.log("Waiting for packet..");
            while (isRunning && !isInterrupted()) {
                DatagramPacket packet = new DatagramPacket(
                        new byte[WiFiPacket.PACKET_SIZE],
                        WiFiPacket.PACKET_SIZE);
                try {
                    socket.receive(packet);
                    app.log("Received " + packet.getLength()
                            + " bytes, trying to parse!");
                    parsePacket(packet);
                } catch (SocketTimeoutException e) {
                } catch (Exception e) {
                    app.log("Something went wrong: " + e.getMessage());
                    e.printstacktrace();
                }
            }
            socket.close();
            app.log("Closing UDP socket");
        } catch (Exception e) {
            e.printstacktrace();
        }
    }

常量WiFiPacket.PACKET_SIZE设置为1024 * 32(32 KB,因为我收到“ERRBLABLA MSG太长”错误,值较高).

FileTransferService.java

@Override
protected void onHandleIntent(Intent intent) {
    App app = (App) getApplication();

    Context context = getApplicationContext();
    boolean rightIntent = false;
    WiFiFile file = null;

    if (intent.getAction().equals(ACTION_SEND_TEXT)) {
        rightIntent = true;
        file = WiFiFile.fromText(intent.getExtras().getString(EXTRAS_TEXT));
    } else if (intent.getAction().equals(ACTION_SEND_FILE)) {
        rightIntent = true;
        file = WiFiFile.fromFile(intent.getExtras().getString(
                EXTRAS_FILE_PATH));
    }
    if (rightIntent && file != null) {

        app.getonWiFiTransmissionChangedListener().onNewOutgoingTransfer(
                file);
        String text = intent.getExtras().getString(EXTRAS_TEXT);
        String host = intent.getExtras().getString(
                EXTRAS_GROUP_OWNER_ADDRESS);
        DatagramSocket socket = null;
        int port = intent.getExtras().getInt(EXTRAS_GROUP_OWNER_PORT);
        Log.d(TAG, "Sending packets to " + host + ":" + port);
        try {
            socket = new DatagramSocket();
            int bytesSent = 0;
            for (WiFiPacket p : file) {
                Log.d(TAG, "Preparing another packet..");
                byte[] payload = p.getBytes();
                DatagramPacket packet = new DatagramPacket(payload,
                        payload.length, InetAddress.getByName(host), port);
                Log.d(TAG, "Sending packet..");
                socket.send(packet);
                bytesSent += payload.length;
                Log.d(TAG, "Packet send! Contained " + payload.length
                        + " bytes! All over we've sent about " + bytesSent
                        + " bytes!");
                List<WiFiFile> list = new ArrayList<WiFiFile>();
                list.add(file);
                app.getonWiFiTransmissionChangedListener()
                        .onTransferProgressChanged(list);
            }

            app.getonWiFiTransmissionChangedListener()
                    .onFileTransferSuccessful(file);

            Log.d(TAG, "Client: Data written");
        } catch (IOException e) {
            e.printstacktrace();
            Log.e(TAG, e.getMessage());
        } finally {
            if (socket != null) {
                if (socket.isConnected()) {
                    socket.close();
                }
            }
        }

    }
}

代码可能不是最好的,但至于现在我唯一关心的是接收该死的数据包.

Android Studio永远不会完成将应用程序上传到Nexus 10

Android Studio永远不会完成将应用程序上传到Nexus 10

我有一台Nexus 10,我决定开始学习 Android.我安装了 Android Studio,打开了USB Debugging并在Android Studio中显示,但是当我尝试调试应用时,它说:
Waiting for device.
Target device: samsung-nexus_10-R32D100GNFL
Uploading file
    local path: C:\Users\Kamen\AndroidStudioProjects\MyApplicationProject\MyApplication\build\apk\MyApplication-debug-unaligned.apk
    remote path: /data/local/tmp/com.some.myapplication

它永远不会完成上传,只需保持数小时和数小时.

当我尝试使用我的三星galaxy Ace 2时,它会立即开始调试.

请帮忙 :)

解决方法

尝试使用一根或两根其他不同的USB电缆.我们看到这个问题发生了很多,不同的电缆有时会有所帮助.我不完全确定为什么会这样;不同的设备有不同的USB硬件和软件,有时候会出奇的挑剔.

Android Wear将数据发送到Android手机,但手机似乎永远不会收到它

Android Wear将数据发送到Android手机,但手机似乎永远不会收到它

简短摘要:我正在尝试使用PutDataRequest和Googleapiclient将 Android Wear手表中的数据发送到Android手机.日志似乎表明数据已成功发送,但onDataChanged永远不会触发.我使用的是Android Studio 1.0.2.我没有使用任何模拟器,而是使用我自己的Android Wear手表 – 我已配对并通过手机上的Android Wear设备和Android Wear应用程序启用调试.在手机和Wear的AndroidManifest.xml上,我都包含了com.google.android.gms.version.

在Android手机(Android 4.4.4版本)上,我使用了一个侦听器服务,该服务通过AndroidManifest.xml绑定,并通过手机上的主要活动启动.从日志中,我可以确认在手机上成功创建了服务,但是没有收到任何数据(onDataChanged永远不会触发 – 准确地说).

<!-- Phone manifest,registers the listener -->
    <service android:name=".DataLayerListenerService" >
        <intent-filter>
            <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
        </intent-filter>
    </service>

这是在手机上运行的监听服务:

public class DataLayerListenerService extends WearableListenerService {
    private static final String TAG = DataLayerListenerService.class.getName();
    private Googleapiclient mGoogleapiclient;

    private static final String WEaraBLE_DATA_PATH = "/audio";

    @Override
    public void onCreate() {
        // I can see this fires properly on the Android mobile phone
        Logger.d(TAG,"onCreate");
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        // This never fires on the Android mobile phone,even though Wear says data was sent successfully
        Logger.d(TAG,"on change");
    }
}

在Wear设备上,我有一个主要活动,可以创建一个Google Api客户端.我使用UI按钮从音频生成输入(代码未显示),我知道这是因为日志记录正常工作.然后我尝试将这些数据从磨损设备发送到手机.在日志中,我看到“结果可用.状态:状态{statusCode = SUCCESS,resolution = null}”(我使用结果回调来跟踪).

public class MainActivity extends Activity implements
    Googleapiclient.ConnectionCallbacks,Googleapiclient.OnConnectionFailedListener {
    private static final String TAG = MainActivity.class.getName();
    private static final int SPEECH_REQUEST_CODE = 1;

    private static final int RECORDER_SAMPLERATE = 44100;
    private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
    private static final int RECORDER_AUdio_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

    private TextView mTextView;
    private AudioRecord recorder;
    private int bufferSize = 0;
    private Thread recordingThread = null;
    private Googleapiclient mGoogleapiclient;
    private volatile boolean isRecording;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG,"Creating MainActivity");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
        stub.setonLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
            @Override
            public void onLayoutInflated(WatchViewStub stub) {
                mTextView = (TextView) stub.findViewById(R.id.text);
            }
        });

        mGoogleapiclient = new Googleapiclient.Builder(this)
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }

    // Connect to the data layer when the Activity starts
    @Override
    protected void onStart() {
        super.onStart();
        mGoogleapiclient.connect();
    }

    protected void onResume() {
        if (null != mGoogleapiclient && !mGoogleapiclient.isConnected()) {
            mGoogleapiclient.connect();
        }
        super.onResume();
    }

    @Override
    protected void onStop() {
        if (null != mGoogleapiclient && mGoogleapiclient.isConnected()) {
            mGoogleapiclient.disconnect();
        }
        super.onStop();
    }

    // Placeholders for required connection callbacks
    @Override
    public void onConnectionSuspended(int cause) {
        Log.d(TAG,"Connection suspended");
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.d(TAG,"Connection Failed");
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        Log.d(TAG,"Connected successfully");
    }

    // This is invoked from the UI,via a helper method not shown. Logs show the method is invoked fine.
    private void processRawAudioData() {
        byte data[] = new byte[bufferSize];
        int read = 0;
        while(isRecording) {
            read = recorder.read(data,bufferSize);

            if(AudioRecord.ERROR_INVALID_OPERATION != read) {
                Log.d(TAG,"Successfully read " + data.length + " bytes of audio");
                Log.d(TAG,"Initial ten bytes: " + data[0] + data[1] + data[2] + data[3]
                    + data[4] + data[5] + data[6] + data[7] + data[8] + data[9] + data[10]);

                Asset myAsset = Asset.createFromBytes(data);
                PutDataRequest request = PutDataRequest.create("/audio");
                // might need to change time each time for other end to see change.
                request.putAsset("profileImage",myAsset);
                PendingResult<DataApi.DataItemResult> result =
                    Wearable.DataApi.putDataItem(mGoogleapiclient,request);
                result.setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                    @Override
                    public void onResult(DataApi.DataItemResult dataItemResult) {
                     // LOGS SHOW STATUS "MainActivity﹕ result available. Status: Status{statusCode=SUCCESS,resolution=null}"   
                     Log.d(TAG,"result available. Status: " + dataItemResult.getStatus());
                    }
                });
            }
        }
    }
}

解决方法

为了让WearableListenerService触发’onDataChanged’事件,主应用程序和可穿戴应用程序中的applicationId必须匹配(build.gradle文件).

另外,你不能发送静态数据,数据必须改变.这意味着PutDataMapRequest对象中的数据必须更改.

Android WiFi Direct – 连接没有提示?

Android WiFi Direct – 连接没有提示?

在创建 Android WiFi Direct P2P连接时,是否可以自动连接两个设备而无需用户点击“接受”按钮?

解决方法

有点迟到的反应,但它可能有助于搜索答案的人.

是的,可以通过创建Access Point来实现,如@hengsti所说,但我建议考虑使用Google Nearby Connections API(Nearby -> Connections API).它更可靠,更易于使用.

android – AsyncTask线程永远不会死

android – AsyncTask线程永远不会死

我正在使用AsyncTasks来获取数据以响应用户按下按钮.这很好用并且在获取数据时保持接口响应,但是当我检查Eclipse调试器中发生了什么时,我发现每次创建一个新的AsyncTask时(这通常是因为它们只能被使用)曾经),正在创建一个新线程,但从未终止.

结果就是大量的AsyncTask线程就在那里.我不确定这在实践中是否是一个问题,但我真的想摆脱那些额外的线程.

我怎么能杀死这些线程?

解决方法:

AsyncTask管理一个使用ThreadPoolExecutor创建的线程池.它将有5到128个线程.如果有超过5个线程,那么这些额外的线程将被移除最多10秒钟. (注意:这些数字适用于目前可见的开源代码,因Android版本而异).

请保留AsyncTask线程.

关于android – UDP数据包(通过WiFi Direct)永远不会到达android udp通信的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android Studio永远不会完成将应用程序上传到Nexus 10、Android Wear将数据发送到Android手机,但手机似乎永远不会收到它、Android WiFi Direct – 连接没有提示?、android – AsyncTask线程永远不会死的相关知识,请在本站寻找。

本文标签: