2013-07-23 38 views
8

Làm cách nào để có được cài đặt sử dụng dữ liệu nền cho ứng dụng trong Android? Ngoài ra, chúng tôi có thể thay đổi cài đặt này theo mã không?Cách nhận trạng thái sử dụng dữ liệu Nền ứng dụng bất kỳ trong Android

enter image description here

+0

Bạn đang nhắm mục tiêu các thiết bị gốc? – ozbek

+0

Có cách nào trên thiết bị gốc hoặc không bắt nguồn từ không. API có sẵn không? –

Trả lời

6

Note: Root truy cập một mình có thể không đủ

Bắt/thiết lập hạn chế dữ liệu nền đòi hỏi "android.permission.MANAGE_NETWORK_POLICY" permission, which is protection level is "signature". Vì vậy, ứng dụng của bạn phải được ký bằng cùng khóa với nền tảng.

Nhưng dù sao, sau đây làm việc trên kết thúc của tôi (Android 4.2.2/mức API 17, thử nghiệm với Google Chrome):

/** NetworkPolicyManager.POLICY_NONE */ 
private static final int POLICY_NONE = 0x0; 
/** NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND */ 
private static final int POLICY_REJECT_METERED_BACKGROUND = 0x1; 
/** Context.NETWORK_POLICY_SERVICE */ 
private static final String NETWORK_POLICY_SERVICE = "netpolicy"; 
/** NetworkPolicyManager object*/ 
private Object mPolicyManager; 

// lots of code 

    mPolicyManager = getSystemService(NETWORK_POLICY_SERVICE); 

// moar code 

private boolean getAppRestrictBackground() { 
    try { 
     ApplicationInfo chrome = getPackageManager().getApplicationInfo("com.android.chrome", 0); 
     try { 
      Method getUidPolicy = mPolicyManager.getClass().getMethod("getUidPolicy", int.class); 
      try { 
       final int uidPolicy = (Integer) getUidPolicy.invoke(mPolicyManager, chrome.uid); 
       return (uidPolicy & POLICY_REJECT_METERED_BACKGROUND) != 0; 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (NullPointerException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } catch (NoSuchMethodException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } catch (NameNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return false; 
} 

private void setAppRestrictBackground(boolean restrictBackground) { 
    try { 
     ApplicationInfo chrome = getPackageManager().getApplicationInfo("com.android.chrome", 0); 
     try { 
      Method setUidPolicy = mPolicyManager.getClass().getMethod("setUidPolicy", int.class, int.class); 
      try { 
       setUidPolicy.invoke(mPolicyManager, chrome.uid, restrictBackground ? POLICY_REJECT_METERED_BACKGROUND : POLICY_NONE); 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (NullPointerException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } catch (NoSuchMethodException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } catch (NameNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Tài liệu tham khảo:

CẬP NHẬT

Làm thế nào tôi có thể đăng ký ứng dụng của tôi với chính nền tảng?

Bạn phải có khóa nền tảng: không có thủ thuật nào ở đây, bạn chỉ cần có khóa. Xem "Sign your application with your private key" để biết thêm chi tiết. Thông thường, OEM giữ các khóa nền tảng của họ với mức bảo mật cao nhất có thể. Đó là, các nhà phát triển bên thứ ba sẽ không bao giờ có quyền truy cập vào khóa nền tảng. Lưu ý rằng, ngay cả khi bạn nắm giữ khóa nền tảng, bạn sẽ cần phải tạo ứng dụng riêng biệt cho mỗi thiết bị của OEM vì mọi OEM đều sử dụng khóa duy nhất của riêng nó.

Cuối cùng, trừ khi bạn đang làm việc trực tiếp với OEM, nó không đáng để nỗ lực.

+0

Làm thế nào tôi có thể Đăng ký ứng dụng của tôi với phím Nền tảng. –

+1

:) Bạn phải có chìa khóa. – ozbek

+0

Tính năng này chỉ hoạt động trên Thiết bị gốc? Tôi không thể làm như vậy mỗi khi nhận được cùng một lỗi 08-12 13: 18: 43.970: W/System.err (9844): java.lang.NoSuchMethodException: getUidPolicy [int] Trợ giúp Plzzz –

Các vấn đề liên quan