Android iBeacon App not working in the background

折月煮酒 提交于 2019-12-01 12:53:10

问题


I have developed Android app to detect the beacon if the customer is near to 1 mt distance . I am using Android Beacon Library to develop the application.When we are in foreground the I get the notification but as soon as the application goes into background .. notification stooped working . Could you help me where am I wrong ? Below is the code for BeaconApp and MainActivity.

BeaconApp.java

public class BeaconApp extends Application implements BootstrapNotifier {
    private static final String TAG = "BeaconApp";
    private RegionBootstrap regionBootstrap;
    private Region allbeaconsregions;
    private BackgroundPowerSaver bgSaver;
    BeaconManager beaconManager;
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "App started up");
        // To detect proprietary beacons, you must add a line likebelowcorresponding to your beacon
        // type.  Do a web search for "setBeaconLayout" to get the proper expression.
        // beaconManager.getBeaconParsers().add(new BeaconParser().
        //        setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));

        // wake up the app when any beacon is seen (you can specify specific id filers in the parameters below)
        beaconManager = BeaconManager.getInstanceForApplication(this);
        Beacon.setHardwareEqualityEnforced(true);
        bgSaver = new BackgroundPowerSaver(this);
        beaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));


        allbeaconsregions = new Region("treewalker", null, null, null);
        regionBootstrap = new RegionBootstrap(this, allbeaconsregions);
        //beaconManager.bind(this);
    }

    @Override
    public void didDetermineStateForRegion(int arg0, Region arg1) {
        // Don't care
        Log.d(TAG, "Enter in  didDetermineStateForRegion call");
    }

    @Override
    public void didEnterRegion(Region arg0) {
        Log.d(TAG, "Got a didEnterRegion call");
        // This call to disable will make it so the activity below only gets launched the first time a beacon is seen (until the next time the app is launched)
        // if you want the Activity to launch every single time beacons come into view, remove this call.
        regionBootstrap.disable();
        Intent intent = new Intent(this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        // Important:  make sure to add android:launchMode="singleInstance" in the manifest
        // to keep multiple copies of this activity from getting created if the user has
        // already manually launched the app.
        this.startActivity(intent);


    }

    @Override
    public void didExitRegion(Region arg0) {
        // Don't care
        Log.d(TAG, "Enter in  didExitRegion call");
    }



}

In MainActivity.java

public class MainActivity extends AppCompatActivity implements BeaconConsumer,RangeNotifier {
    protected static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBeaconManager = BeaconManager.getInstanceForApplication(this);
        Beacon.setHardwareEqualityEnforced(true);
        BackgroundPowerSaver bgSaver = new BackgroundPowerSaver(this);
        mBeaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
        mBeaconManager.bind(this);


    }

    private BeaconManager mBeaconManager;

    public void onResume() {
        super.onResume();
        mBeaconManager = BeaconManager.getInstanceForApplication(this.getApplicationContext());
        // Detect the main Eddystone-UID frame:
        mBeaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
        mBeaconManager.bind(this);
    }


   public void onBeaconServiceConnect() {


           try {
               mBeaconManager.startRangingBeaconsInRegion(new Region("treewalker", null, null, null));
               mBeaconManager.addRangeNotifier(this);
           }catch (RemoteException e){
               e.printStackTrace();
           }


   }

    @Override
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {

        if(beacons.size() > 0) {
            for (Beacon beacon : beacons) {
                if (beacon.getDistance() < 1.0) {
                    Log.d(TAG, "I see a beacon transmitting a : " +
                            " approximately " + beacon.getDistance() + " meters away.");

                    Log.d(TAG, "BEACON DATA : " +beacon.getBluetoothAddress()+":"+beacon.getBluetoothName()+":"+beacon.getId1());

                    showNotification("Treewalker","You are near beacon range");
                    Intent intent = new Intent(this,MainActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    this.startActivity(intent);


                }


            }
        }
    }

    public void showNotification(String title, String message) {
        Intent notifyIntent = new Intent(this, DashboardActivity.class);
        notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivities(this, 0,
                new Intent[] { notifyIntent }, PendingIntent.FLAG_UPDATE_CURRENT);
        Notification notification = new Notification.Builder(this)
                .setSmallIcon(android.R.drawable.ic_dialog_info)
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .build();
        notification.defaults |= Notification.DEFAULT_SOUND;
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, notification);
    }
    @Override
    public void onPause() {
        super.onPause();
        //mBeaconManager.unbind(this);
    }
}

回答1:


The problem is that when your app goes to the background, the MainActivity will call onPause, and the code inside that method calls the mBeaconManager.unbind(this); method, which effectively stops beacon ranging.

If you want ranging to continue in the background, the easiest thing to do is move the following two lines:

mBeaconManager.startRangingBeaconsInRegion(new Region("treewalker", null, null, null));
mBeaconManager.addRangeNotifier(this);

to the BeaconApp class' didDetermineStateForRegion method. You'll also need to move the didRangeBeaconsInRegion and showNotification methods there, too.



来源:https://stackoverflow.com/questions/44971138/android-ibeacon-app-not-working-in-the-background

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!