2016-09-27 14 views
1

在設置應用程序中,我試圖接收有關更改網絡狀態的消息。 它看起來像這樣:如何解決在系統android應用程序中調用沒有合格用戶的系統進程中的方法這個錯誤?

<receiver android:name="com.android.settings.NetworkStateReceiver"> 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
     </intent-filter> 
</receiver> 



public class NetworkStateReceiver extends BroadcastReceiver 
{ 
    public static final String TAG = "NetworkStateReceiver"; 
    public static final String NETWORK_CHANGED_ACTION = "com.android.settings.NetworkStateReceiver.NETWORK_CHANGED"; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Log.d(TAG, "Network state changed"); 
     Intent i = new Intent(); 
     i.setAction(NETWORK_CHANGED_ACTION); 
     context.sendBroadcast(i); 
    } 
} 

從這個接收器我試圖將消息發送到DeviceInfoFragment,有接收器,它應該抓住這個廣播:

private BroadcastReceiver mNetwrokStateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

     Log.d("NetworkStateReceiver_DEVICE_INFO", "network state changed"); 
     if (isNetworkConnected()) { 
      Log.d("NetworkStateReceiver_DEVICE_INFO", "network connected"); 
      mHelpPreference.setEnabled(true); 
     } else { 
      mHelpPreference.setEnabled(false); 
      Log.d("NetworkStateReceiver_DEVICE_INFO", "network disconnected"); 
     } 
    } 
}; 

我註冊它的onResume和註銷在onPause。

但我在NetworkStateReceiver在此行中遇到錯誤:

context.sendBroadcast(i); 

調用系統中的處理的方法沒有一個合格的用戶

有沒有什麼辦法可以解決?

回答

0

而不是使用sendBroadcast(Intent intent)的,使用此

sendBroadcastAsUser(i, new UserHandle(UserHandle.USER_CURRENT)); 
+0

試過了,也不行 – Pein

+0

你提供'INTERACT_ACROSS_USERS'許可? – fluffyBatman

+0

經過許可,結果相同:( – Pein

2

這只是一個警告。

你可以看到,通過查看源代碼: https://android.googlesource.com/platform/frameworks/base/+/b267554/core/java/android/app/ContextImpl.java

只要搜索方法「warnIfCallingFromSystemProcess()」

+0

感謝您提供有洞察力的答案。不幸的是,似乎沒有辦法抑制警告並維護系統uid以獲得額外的權限,也沒有任何文檔說明爲什麼它是警告系統應用程序的第一名,這很奇怪。 – jschlepp

相關問題