如果您对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 Studio永远不会完成将应用程序上传到Nexus 10
- Android Wear将数据发送到Android手机,但手机似乎永远不会收到它
- Android WiFi Direct – 连接没有提示?
- android – AsyncTask线程永远不会死
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
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时,它会立即开始调试.
请帮忙 :)
解决方法
Android Wear将数据发送到Android手机,但手机似乎永远不会收到它
在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()); } }); } } } }
解决方法
另外,你不能发送静态数据,数据必须改变.这意味着PutDataMapRequest对象中的数据必须更改.
Android WiFi Direct – 连接没有提示?
解决方法
是的,可以通过创建Access Point来实现,如@hengsti所说,但我建议考虑使用Google Nearby Connections API(Nearby -> Connections API).它更可靠,更易于使用.
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线程永远不会死的相关知识,请在本站寻找。
本文标签: