如何在系统android应用程序中修复在没有合格用户的情况下在系统进程中调用方法这个错误?

Pei*_*ein 7 android android-source

在设置应用程序中,我试图接收有关更改网络状态的消息。它看起来像这样:

 <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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我试图从这个接收器向 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");
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

我在 onResume 中注册它并在 onPause 中取消注册。

但是我在这一行的NetworkStateReceiver中遇到错误:

context.sendBroadcast(i);
Run Code Online (Sandbox Code Playgroud)

在没有合格用户的情况下调用系统进程中的方法

有什么办法可以解决吗?

Bam*_*rza 5

这只是一个警告。

您可以通过查看源代码看到这一点: https: //android.googlesource.com/platform/frameworks/base/+/b267554/core/java/android/app/ContextImpl.java

只需搜索方法“warnIfCallingFromSystemProcess()”


Bre*_* K. 5

如果您正在开发市场应用程序,则无法消除此警告。

如果您是手机供应商,则可以添加到您的清单中

<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
Run Code Online (Sandbox Code Playgroud)

然后可以作为实际用户发送广播。

context.sendBroadcastAsUser(i, new UserHandle(UserHandle.USER_CURRENT));
Run Code Online (Sandbox Code Playgroud)

仅当正确配置时,启动的应用程序才会获得提升的权限。

  • @GuilhermeSantos Context 提供了 startActivityAsUser 和 startServiceAsUser,但这些同样适用于手机供应商,并且不适用于第 3 方应用程序开发人员。如果您使用 Android Studio 发布应用程序,则无法抑制这些警告。唯一的解决方案是找到一个不广播 Intents 的实现来获得所需的行为。 (3认同)