【问题标题】:How to catch GPS off broadcast once?如何在广播中捕捉 GPS 一次?
【发布时间】:2015-06-29 18:48:06
【问题描述】:

我已经上网,但我没有找到解决问题的方法。

在我的 android 应用程序中,每次用户关闭 GPS 时,我都必须捕获并向服务器发送通知。这时候我已经写了这段代码

在 Android 清单中:

    <receiver android:name="proguide.prosegur.scr.BL.receivers.GPSStatusBroadcastReceiver">
        <intent-filter>
            <action android:name="android.location.PROVIDERS_CHANGED" />
        </intent-filter>
    </receiver>

在 GPSStatusBroadcastReceiver 类中:

public class GPSStatusBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context arg0, Intent arg1) {
    if (arg1.getAction().matches("android.location.PROVIDERS_CHANGED")) {
        // here I have to send the notification
    }
}

问题是每次用户放下 GPS 时,我都会使用相同的 Context 和 Intent 参数调用此函数两次(我一次只能发送 1 个通知)。

重要提示:它必须在 API 级别 8 下工作。

那么,为什么这会发生两次?我能做些什么(做对了,不要弄乱代码)一次只发送 1 个通知?谢谢,对不起我的英语。

【问题讨论】:

  • 如何称呼“onReceive”?你使用循环吗?
  • 只需检查isProviderEnabled 方法,看看它是否返回false。请参阅下面的答案。
  • 据我了解,将该行放在清单中会使您的应用在每次应用触发“android.location.PROVIDERS_CHANGED”时调用 GPSStatusBroadcastReceiver 类中的 onRecive 方法,因为您是这样设置的。然后,您必须实现 BroadcastReceiver 类的 onRecive 方法。
  • 我会通过Service 注册BroadcastReceiver,而不是在AndroidManifest.xml 文件中声明BroadcastReceiver 操作。请参阅我的更新答案。
  • 这是因为您在清单文件和 GPSStatusBroadcastReceiver 中定义了两次。所以很自然你会调用两次 GPS 函数。你期望什么行为?

标签: android broadcastreceiver


【解决方案1】:

试试这个:

public class GpsReceiver extends BroadcastReceiver {        
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
            final String action = intent.getAction();
            if (action.equals(LocationManager.PROVIDERS_CHANGED_ACTION)) {
                // GPS is switched off.
                if (!context.getSystemService(Context.LOCATION_SERVICE).isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                    // Do something.
                }
            } 
        }
    }
}

另外,您应该使用 Android 提供的变量 LocationManager.PROVIDERS_CHANGED_ACTION,而不是硬编码 "android.location.PROVIDERS_CHANGED"

不要在AndroidManifest.xml 文件中设置您的 GPS 接收器,而是通过 Service 注册您的 GPS 接收器,如下所示:

public class GpsService extends Service {
    private BroadcastReceiver mGpsReceiver;
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       super.onStartCommand(intent, flags, startId);
       registerReceiver();
       return Service.START_NOT_STICKY;
    }
    private void registerReceiver() {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
            IntentFilter mIntentFilter = new IntentFilter();
            mIntentFilter.addAction(LocationManager.PROVIDERS_CHANGED_ACTION);
            this.mGpsReceiver = new GpsReceiver();
            this.registerReceiver(this.mGpsReceiver, mIntentFilter);
        }       
    }
}

【讨论】:

  • 它的行为似乎和以前一样。而且,说真的,我看不出有什么区别。还是谢谢!
  • 您可能已经多次呼叫 GPS 接收器。不要在AndroidManifest.xml 文件中设置您的GPS 接收器,而是通过Service 注册您的GPS 接收器。我就是这样做的。
  • 是的,我之前也看到过这个回复。问题是它必须在 API 级别 8 下运行,即代码,特别是 mIntentFilter.addAction(LocationManager.PROVIDERS_CHANGED_ACTION); 这一行至少需要 API 级别 9
  • 然后您需要编辑您的帖子并声明您希望您的代码在 API 级别 8 下运行。LocationManager.PROVIDERS_CHANGED_ACTION 仅在 API 级别 9 中引入,所以我怀疑它是否适用于 API 8 级。请参阅here 了解更多信息。
  • 好吧.. 对不起那个细节!无论如何,你很有帮助。您知道如何以您发布的方式解决此问题吗?
【解决方案2】:

您可以使用 sharedpreference 和线程来避免这个问题 但这不是克服这个问题的正确方法

我的方法如下

 @Override
    public void onReceive(Context context, Intent intent) {

boolean flage=MainActivity.getpreference();

if(!flage){
    MainActivity.putPreferens(true);
    Log.e("gpssss","gpssss");

    Thread thread = new Thread() {
        @Override
        public void run() {
            try {




                    sleep(2000);

                    MainActivity.putPreferens(false);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };

    thread.start();


     }}

}

到主类我创建一个共享首选项并存储布尔值 false 广播将播放一次。

【讨论】:

  • 我认为这也是一个很好的方法。反正我已经解决了。谢谢!
  • 欢迎您。我认为这不是正确的方法,无论如何它的工作我很高兴听到你的声音。
猜你喜欢
  • 2014-01-24
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多