我知道這似乎是一個重複的問題,但實際上並非如此。我想通過套接字與一些傳感器進行通信。模擬器上的連接工作正常,但是當我在Android設備上上傳時,它無法工作。調試後,我縮小了我的應用程序,使用下面的代碼簡單地打開套接字。在Android設備上打開套接字
try
{
Socket socket = new Socket(InetAddress.getByName(ipAddress).getHostAddress(), 10001);
}
catch (Exception e)
{
Toast.makeText(context, "Error: "+e.getMessage(), duration).show();
}
我只是打開一個socket.This工作在模擬器罰款,但是當我在設備上運行這個程序,它掛了一段時間,並顯示我什麼也不例外消息...任何想法可能是什麼成爲問題。 (最初它是StrictMode問題,但我整理出來了)。 LogCat沒有錯誤。我已經安裝了android終端模擬器,並嘗試ping,答覆很好。在此先感謝
這是代碼
import java.net.InetAddress;
import java.net.Socket;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;
public class MainActivity extends Activity implements OnClickListener {
Button btn;
private CharSequence text = "";
private Socket s;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(this);
}
public void onClick(View view){
//detect the view that was "clicked"
switch(view.getId())
{
case R.id.button1:
new LongOperation().execute("");
break;
}
}
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
try {
s = new Socket(InetAddress.getByName("o2215.airq.org").getHostAddress(), 10001);
text = "Connection Made";
} catch (Exception e) {
text = "Error : ";
for(int i=0;i<e.getStackTrace().length;i++)
{
text = text +"\n"+ e.getStackTrace()[i];
}
e.printStackTrace();
}
return "";
}
@Override
protected void onPostExecute(String result) {
TextView txt = (TextView) findViewById(R.id.output);
txt.setText(text);
}
}
}
也能正常工作在模擬器上,而不是在設備上。
我想你想到的所有權限的東西?如果不是,應該會導致異常,但是你沒有提到,所以我只是要求確定。你有沒有嘗試過,如果你可以從別的地方(除了模擬器)打開目標連接? – Fildor
ipAddress究竟是什麼?模擬器和設備的地址可能不同(因爲模擬器必須通過主機的操作系統)。 – SirRichie
@Fildor是的我已經給了這些權限 uses-permission> 我想這就是爲什麼它在模擬器上工作,否則會導致異常。是的,我可以從任何瀏覽器連接到目標,就像我說我用終端仿真器ping它,工作正常。 –