2016-06-09 113 views
10

我寫了一個應用程序,觸發一個索尼qx智能手機可連接相機通過WiFi。但是,我需要通過另一個本地網絡實時傳送圖像。由於無線網卡被用於qx連接,我需要能夠通過USB使用以太網傳輸圖像。 Http請求將用於觸發相機並將圖像從手機中發送出去。在一個應用程序中使用多個網絡接口

是否有可能在兩個網絡接口設置的手機上的一個Android應用程序中指定某些http請求使用一個網絡接口併爲其他網絡接口使用另一個網絡接口?這是否需要通過路由表完成,而不是java?

我使用的手機是一個根深蒂固的nexus 6p。

更新:

目前,我能得到一個以太網適配器與設備(的Nexus 6P)工作。設備通過以太網連接到本地網絡。當Wi-Fi接口關閉時,我可以ping設備通過以太網連接到的本地網絡上的所有設備。但是,我無法通過該網絡上的任何設備(我知道它們正在運行)訪問網絡服務器(不使用DNS),即通過瀏覽器應用程序訪問Http。 nexus 6p通過以太網通過Ubiquiti Station連接到網絡。這似乎是一個路由問題。

我可以連接(usb接口)並在一個應用程序中使用Wi-Fi,這使我相信可以使用以太網和Wi-Fi。

UPDATE2

更多的測試後,它似乎是,這是一個權限問題。因爲當我ping網絡時,設備通過以太網連接,而不是在終端中運行su,網絡不存在。但是,當我運行su然後ping時,我可以ping網絡。因此,看起來我的應用需要在訪問以太網之前獲得超級用戶權限。我已授予超級用戶訪問權限,但沒有任何更改。我讀到,僅僅運行su是不夠的,從這個post的意見之一。這是因爲su只是產生了死亡的root shell。這也解釋了爲什麼我無法通過瀏覽器應用程序訪問此網絡上的任何Web服務器。在進行HTTP調用時可以授予我的應用程序訪問以太網接口的權限,如給予HttpURLConnection根訪問權限(如果這樣做有意義)(運行su不起作用)?似乎肯定有解決方案,因爲HttpURLConnection可以通過USB共享接口撥打電話(Nexus 6P稱其爲rndis0)很好。

更新3

我在網上找到here,我可以讓我的應用程序的系統應用程序(想這可能授予應用程序的eth0訪問)。我只是將我的應用程序移動到/system/app,然後重新啓動。然而,這似乎沒有給予應用程序更多的權限(因此不能解決問題),或者還有其他需要製作應用程序系統的東西,而不僅僅是將其複製到/system/app

更新4

所以我能得到以太網上的每一個應用程序的工作沒有root權限!它似乎只能通過DHCP工作,並不喜歡我使用的靜態連接。它支持Wi-Fi,但是,啓用以太網後,我無法聯繫Wi-Fi網絡上的任何設備。有沒有解決的辦法?它是否與設置兩個默認網關有關?

回答

2

因爲你的Nexus 6P進行編程,你可以嘗試使用ConnectivityManager添加了新的API,以選擇以太網你的過程您的首選網絡連接。

由於我無法構建像您的類似環境,我不確定它是否有效。這只是一個建議的解決方案,完全沒有經過測試和驗證。

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
Network etherNetwork = null; 
for (Network network : connectivityManager.getAllNetworks()) { 
    NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network); 
    if (networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) { 
     etherNetwork = network; 
    } 
} 
Network boundNetwork = connectivityManager.getBoundNetworkForProcess(); 
if (boundNetwork != null) { 
    NetworkInfo boundNetworkInfo = connectivityManager.getNetworkInfo(boundNetwork); 
    if (boundNetworkInfo.getType() != ConnectivityManager.TYPE_ETHERNET) { 
     if (etherNetwork != null) { 
      connectivityManager.bindProcessToNetwork(etherNetwork); 
     } 
    } 
} 
+0

所以我只是試過這種方法。當Ethernet和Wi-Fi開啓時,connectivityManager.getAllNetworks()似乎只返回Wi-Fi接口(長度= 1),而當以太網打開時(長度= 0),它不會返回任何內容。由於運行'ifconfig'返回'eth0'作爲接口,因此該設備顯然具有接口,並且可以按照上面所述ping設備。我甚至嘗試將我的應用移至系統應用。然而,我覺得我在製作應用系統時錯過了一個步驟,因爲將它移動到'/ system/app'似乎絕對無能爲力。 – dylan7

+0

切換到root,將APK的用戶和組所有者修改爲root。然後將APK的權限更改爲644.'su','chown root.root/system/app/your.apk','chmod 644/system/app/your.apk'。然後可能有權訪問代碼中的eth0設備。 – alijandro

+0

如果您認爲製作系統應用時出現問題,請檢查logcat。當應用程序嘗試運行shell命令時,您將收到權限錯誤。 – ekilic

0

大多數的android電視盒可以一起使用wifi和以太網。在我的設備中,我可以從這個路徑啓用以太網--- 設置 - >更多...>以太網--- 但是你的設備不會有這樣的菜單,據我瞭解。所以你應該做一個應用程序來做到這一點。此應用程序需要訪問某些系統特定的資源,以便您的設備需要根植或應用程序需要使用系統簽名進行簽名。 另外這個話題可以幫助您link

+0

看來,Nexus 6P無法訪問getSystemService(「ethernet」)',因爲它表示在您鏈接的文章中使用。 – dylan7

0

只是多給點解釋一下這個問題最終如何解決。

利用@ alijandro的答案我可以在一個應用程序中在以太網和Wi-Fi之間來回切換。由於以太網工作的某些原因,它需要網絡網關提供DHCP地址,而不是靜態地址。然後,由於在@ alijandro的回答中使用的bindProcessToNetwork是每個進程,我決定將與QX相機的通信拆分爲在單獨進程中運行的Service。主應用程序(另一個進程)將通過以太網將映像發佈到本地網絡。我成功地通過以太網上的HTTP與本地網絡上的設備聯繫,同時通過Wi-Fi觸發QX。目前,我使用Messenger來使用IPC進行通信,以告訴QX觸發Service調用哪些方法。

相關問題