[英]Android java.net.SocketException:socket failed: EACCES (Permission denied)
[英]Android java.net.SocketException: socket failed: EACCES (Permission denied)
我正在嘗試使用運行嵌入式linux的設備創建TCP / IP連接,我正在使用Android的USB綁定在Android設備和嵌入式Linux設備之間建立以太網連接,我修改了嵌入式linux設備支持RNDIS設備驅動程序。
Android和嵌入式Linux設備工作正常,以太網連接成功建立,我可以從嵌入式Linux ping到android設備,反之亦然。
在我的Android應用程序上,我創建了一個簡單的服務來建立與嵌入式Linux設備的TCP / IP連接,當我嘗試連接時出現問題我得到以下錯誤:
02-17 13:53:13.300: E/TCP Client(2576): C: Connecting...
02-17 13:53:13.310: E/TCP Client(2576): C: Error
02-17 13:53:13.310: E/TCP Client(2576): java.net.SocketException: socket failed: EACCES (Permission denied)
02-17 13:53:13.310: E/TCP Client(2576): at libcore.io.IoBridge.socket(IoBridge.java:583)
02-17 13:53:13.310: E/TCP Client(2576): at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
02-17 13:53:13.310: E/TCP Client(2576): at java.net.Socket.startupSocket(Socket.java:559)
02-17 13:53:13.310: E/TCP Client(2576): at java.net.Socket.<init>(Socket.java:225)
02-17 13:53:13.310: E/TCP Client(2576): at com.example.service.TCPClientThread.run(TCPClientThread.java:75)
02-17 13:53:13.310: E/TCP Client(2576): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
02-17 13:53:13.310: E/TCP Client(2576): at libcore.io.Posix.socket(Native Method)
02-17 13:53:13.310: E/TCP Client(2576): at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
02-17 13:53:13.310: E/TCP Client(2576): at libcore.io.IoBridge.socket(IoBridge.java:568)
02-17 13:53:13.310: E/TCP Client(2576): ... 4 more
我已將配置文件配置如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.dea600"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@drawable/example"
android:label="@string/appName" >
<activity
android:name="com.example.gui.mainActivity"
android:configChanges="orientation|screenSize"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Holo.Light.DarkActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service
android:name="com.example.service.TCPClientService"
android:isolatedProcess="true"
android:label="TCP Client Service"
android:process=":TCPClientService" >
</service>
<receiver
android:name="com.example.service.TCPStartClientService"
android:enabled="true"
android:exported="true"
android:process=":StartTCPService">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
最重要的是如果我使用Android VM(Genymotion)我能夠連接並且正常工作,但是當我嘗試在真實設備上使用它時,我得到了錯誤。
提前感謝您的任何評論。
編輯:
這是我用來創建綁定的代碼,我使用的是端口6540,IP是192.168.42.130
public void run() {
try {
//here you must put your computer's IP address.
InetAddress serverAddr = InetAddress.getByName(SERVERIP);
Log.e("TCP Client", "C: Connecting...");
//create a socket to make the connection with the server
Connection = new Socket(serverAddr, SERVERPORT);
Log.e("TCP Client", "C: Connected...");
// Output Stream
OutStream = new DataOutputStream((OutputStream)Connection.getOutputStream());
// Input stream
InStream = new DataInputStream((InputStream)Connection.getInputStream());
while (ThreadStatus) {
try {
String message = myReadStream(InStream);
if (message.length() > 0) {
Log.e("TCP Client", "Received message ... " + message);
if (mMessageListener != null){
mMessageListener.messageReceived(message);
}
}
} catch (Exception e) {
ThreadStatus = false;
Log.e("TCP Client", "S: Error", e);
}
}
} catch (Exception e) {
Log.e("TCP Client", "C: Error", e);
} finally {
try {
Connection.close();
OutStream.close();
InStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (mConnectionEndListener != null){
mConnectionEndListener.notifyConnectionEnd();
}
}
我相信當我嘗試創建套接字時會發生錯誤( Connection = new Socket(serverAddr,SERVERPORT); )。
機器人:isolatedProcess
如果設置為true,則此服務將在與系統其余部分隔離的特殊進程下運行,並且沒有自己的權限。 與它的唯一通信是通過Service API(綁定和啟動)。
我找到了一個解決這個問題的方法,我將TCP客戶端從服務更改為主應用程序內的異步任務,我不明白為什么它在Genymotion模擬器上工作但它在真實設備上根本沒用使用服務時。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.