android библиотека маяков не начала обнаруживать маяки - PullRequest
0 голосов
/ 29 марта 2020

Я не знаю, в чем проблема с моим кодом, я пытаюсь определить маяк, используя https://altbeacon.github.io/android-beacon-library извините за плохой Engli sh, и я новичок в разработке мобильных приложений.

AndroidManifiets. xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.isleem.hospital">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

    <application
        android:name=".application.BeaconApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.NoActionBar">
        <activity android:name=".activities.MainActivity"/>
        <activity android:name=".activities.BeaconActivity"/>
        <activity
            android:name=".activities.LoginActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

BeaconActivity.class

package com.isleem.hospital.activities;

import android.app.Activity;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;


import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.RangeNotifier;
import org.altbeacon.beacon.Region;

import java.util.Collection;

public class BeaconActivity extends Activity implements  BeaconConsumer  {
    protected static final String TAG = "RangingActivity";
    private BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("naji","beaconactivity");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        super.onPause();
        beaconManager.unbind(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        beaconManager.bind(this);
    }


    @Override
    public void onBeaconServiceConnect() {

        RangeNotifier rangeNotifier = new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                if (beacons.size() > 0) {
                    Log.d(TAG, "didRangeBeaconsInRegion called with beacon count:  "+beacons.size());
                    Beacon firstBeacon = beacons.iterator().next();
                    Log.d("naji","The first beacon " + firstBeacon.toString() + " is about " + firstBeacon.getDistance() + " meters away.");
                } else {
                    Log.d(TAG, "no avilable beacons");
                }
            }
        };
        try {
//            Collection<Region> monitoredRegions = beaconManager.getMonitoredRegions();
//           Log.d("monitoredRegions",monitoredRegions.toString());
            beaconManager.startMonitoringBeaconsInRegion(new Region("myRangingUniqueId",null,null,null));
            beaconManager.addRangeNotifier(rangeNotifier);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

BeaconApplication.class

package com.isleem.hospital.application;

import android.app.Application;
import android.app.Notification;
import android.os.RemoteException;
import android.util.Log;

import com.isleem.hospital.R;

import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.Region;
import org.altbeacon.beacon.powersave.BackgroundPowerSaver;
import org.altbeacon.beacon.startup.BootstrapNotifier;
import org.altbeacon.beacon.startup.RegionBootstrap;

public class BeaconApplication extends Application implements BootstrapNotifier {
    private static final String TAG = "BeaconReferenceApp";
    private RegionBootstrap regionBootstrap;
    private BackgroundPowerSaver backgroundPowerSaver;
    private boolean haveDetectedBeaconsSinceBoot = false;
    private String cumulativeLog = "";
    BeaconManager beaconManager ;
    public void onCreate() {
        super.onCreate();
        beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
        beaconManager.setDebug(false);
        beaconManager.setEnableScheduledScanJobs(false);
        beaconManager.setBackgroundBetweenScanPeriod(0);
        beaconManager.setBackgroundScanPeriod(1100);
        Notification.Builder builder = new Notification.Builder(this);
        builder.setSmallIcon(R.drawable.ic_launcher_background);
        builder.setContentTitle("Scanning for Beacons");
        beaconManager.enableForegroundServiceScanning(builder.getNotification(),0);
        beaconManager.setEnableScheduledScanJobs(false);
        beaconManager.setBackgroundBetweenScanPeriod(0);
        beaconManager.setBackgroundScanPeriod(1100);
        Log.d(TAG, "setting up background monitoring for beacons and power saving");
        Region region = new Region("myRangingUniqueId",
            null, null, null);
        regionBootstrap = new RegionBootstrap(this, region);
        backgroundPowerSaver = new BackgroundPowerSaver(this);
//        try {
//            beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
//        } catch (RemoteException e) {
//            e.printStackTrace();
//        }


}


    @Override
    public void didEnterRegion(Region arg0) {
        // In this example, this class sends a notification to the user whenever a Beacon
        // matching a Region (defined above) are first seen.
        Log.d(TAG, "did enter region.");
        if (!haveDetectedBeaconsSinceBoot) {
            Log.d(TAG, "auto launching MainActivity");

            // The very first time since boot that we detect an beacon, we launch the
            // MainActivity
            //Intent intent = new Intent(this, MonitoringActivity.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);
            haveDetectedBeaconsSinceBoot = true;
        } else {
            // If the Monitoring Activity is visible, we log info about the beacons we have
            // seen on its display
            Log.d("beacon","I see a beacon again" );
            // If we have already seen beacons before, but the monitoring activity is not in
            // the foreground, we send a notification to the user on subsequent detections.
        }
    }

    @Override
    public void didExitRegion(Region region) {
        Log.d(TAG,"I no longer see a beacon.");
    }

    @Override
    public void didDetermineStateForRegion(int state, Region region) {
        Log.d(TAG,"Current region state is: " + (state == 1 ? "INSIDE" : "OUTSIDE ("+state+")"));
    }


}

, и я использую этот код для начать мой BeaconActivity

 Intent intent = new Intent(this, BeaconActivity.class);
    startActivity(intent);

1 Ответ

0 голосов
/ 29 марта 2020

Несколько вещей для проверки:

  1. Ваша реклама на маяке? Попробуйте стандартное приложение, например BeaconScope , и убедитесь, что оно обнаружено.

  2. Вы динамически запрашивали и получали разрешение на местоположение от Пользователь? Вы не можете обнаружить маяки, если не сделаете этого.

  3. Вы установили BeaconParser для типа используемого маяка? Если вы используете AltBeacon, вам не нужно этого делать. Но если вы используете iBeacon, вы делаете .

  4. Вы получаете вызов "didDetermineStateForRegion"? Это говорит о том, что вы уже находитесь в регионе? Если это так, возможно, ваш маяк обнаружен, но библиотека считает, что он уже находится в регионе (она запоминает это при перезапусках), поэтому она никогда больше не вызывает didEnterRegion.

  5. Bluetooth включен? Включено ли местоположение в настройках телефона? Если вы проверяете права доступа к приложению, подтверждает ли оно, что вашему приложению предоставлено разрешение на местоположение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...