2012-03-01 46 views
6

Làm cách nào để bạn bắt đầu kết nối dữ liệu 3G trong Android cùng lúc với WiFi? Tôi cố gắngBắt đầu kết nối 3G theo cách thủ công trong Android và giữ nó trên

IConnectivityManager.setMobileDataEnabled(enabled); // via reflection 

và nó hoạt động trong giả lập, nhưng trong điện thoại thật của tôi (Droid 2), nó quay một thời gian ngắn trên sau đó quay trở lại một lần nữa.

Từ vỏ (adb shell), ip link cung cấp các chi tiết của kết nối 3G:

15: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 3 link/ppp

Tuy nhiên, nó chỉ có sẵn khi WiFi tắt. Khi WiFi bật và tôi cố gắng bật tính năng này theo cách thủ công, nó sẽ phàn nàn rằng thiết bị ppp0 không tồn tại.

bash-3.2# ip link set ppp0 up 
ip link set ppp0 up 
Cannot find device "ppp0" 

Khi tôi cố gắng liệt kê các thiết bị, tôi thậm chí không thể tìm thấy nó

bash-3.2# ls /dev/ppp* 
ls /dev/ppp* 
/dev/ppp 
+0

Tôi có cảm giác tôi sẽ phải biên dịch chương trình C để bật radio. Tôi chỉ không thể có được một thể hiện của một đối tượng Java ConnectivityService để thử các cuộc gọi phương thức cấp ứng dụng khác nhau. – Chloe

Trả lời

0

Bạn có thể thử giữ cả hai hoạt động cùng một lúc bằng cách sửa đổi connectivityservice của bạn, nhưng tôi muốn tư vấn chống lại nó, vì nó rất có thể sẽ phá hủy tuổi thọ pin của bạn.

Xem here nếu bạn muốn cung cấp cho nó một thử anyway (và chắc chắn rằng bạn có một bản sao lưu, rõ ràng)

+0

Cảm ơn, đã thấy điều đó, nhưng nó phải được triển khai và làm việc cho (hầu hết) điện thoại của mọi người. – Chloe

+0

Vấn đề là đây là tiêu chuẩn trong Android (một số điện thoại có thể có cả hai hoạt động cùng một lúc, nhưng hầu hết các điện thoại không). Vì vậy, bạn sẽ phải tìm cách để vượt qua mã android trong ứng dụng của bạn (trong đó tôi không chắc chắn thời tiết hay không nó có thể) – Andreas

+0

Tôi biết điều đó là có thể vì tôi đã thấy các ứng dụng tether làm điều đó. Tôi chỉ cần bật cả hai để có một máy chủ lưu trữ đa giao diện, nhưng không có cầu nối. – Chloe

0

Nếu bạn đang cố gắng để kết nối với một máy tính cụ thể mà bạn có thể thử ConnectivityManager.requestRouteToHost.

+0

Naa Tôi đã thử điều đó. Nó không bật radio và gán IP. Tôi cần quyền truy cập vào bất kỳ máy chủ lưu trữ nào, không chỉ là một máy chủ cụ thể. – Chloe

2

Vì tôi hiểu không thể kết nối 3G và WiFi đồng thời mà không cần sửa đổi mã nguồn nền tảng Android (ít nhất là phiên bản 2.3 và 4). Vấn đề chính là ưu tiên mã hóa cứng các kết nối quy định tại frameworks/base/core/res/res/values/config.xml:

<!-- This string array should be overridden by the device to present a list of network 
attributes. This is used by the connectivity manager to decide which networks can coexist 
based on the hardware --> 
    <!-- An Array of "[Connection name],[ConnectivityManager connection type], 
[associated radio-type],[priority] --> 
<!--     ^^^^^^^^^^---------- Connection priority --> 

    <string-array translatable="false" name="networkAttributes"> 
     <item>"wifi,1,1,1"</item> 
     <item>"mobile,0,0,0"</item> 
     <item>"mobile_mms,2,0,2"</item> 
     <item>"mobile_supl,3,0,2"</item> 
     <item>"mobile_hipri,5,0,3"</item> 
    </string-array> 

config.xml này sau đó được đọc bởi ConnectivityService được đăng ký để kết nối/sự kiện ngắt kết nối. Và trong trình xử lý kết nối, nó quyết định việc cần làm với các kết nối khác:

private void handleConnect(NetworkInfo info) { 

     //------------8-<-------------------------- 

     // if this is a default net and other default is running 
     // kill the one not preferred 
     if (mNetAttributes[type].isDefault()) { 
      if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != type) { 
       if ((type != mNetworkPreference && 
         mNetAttributes[mActiveDefaultNetwork].mPriority > 
         //         ^^^^^^^^^ --- From config.xml 
         mNetAttributes[type].mPriority) || 
         //     ^^^^^^^^^-------- From config.xml 
         mNetworkPreference == mActiveDefaultNetwork) { 
         // don't accept this one 
         if (DBG) Slog.v(TAG, "Not broadcasting CONNECT_ACTION " + 
           "to torn down network " + info.getTypeName()); 
         teardown(thisNet); 
         return; 
      //------------8-<-------------------------- 
Các vấn đề liên quan