1

具体的な iBeacon から広告を取得するために使用するアプリがあります。私はそれを正しく行っており、Bluetoothはうまく機能しています。問題は、ユーザーがアプリをバックグラウンドで実行している具体的な領域に入ったときに、何かをプロンプトまたは起動するふりをするようになったため、AltBeacon lib を使用することにしました。

私はサービスを実装していません。バックグラウンドでアプリを使用してアクティビティを開始するためにチュートリアルに記載されていることを実行するだけです: http://altbeacon.github.io/android-beacon-library/samples.html

例(最後の例)でわかるように、私がしたことはマニフェストを次のように設定することでした:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.googlebeacon"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="18"
        android:targetSdkVersion="18" />
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:name="com.example.googlebeacon.MyRegionApp"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.googlebeacon.MainActivity"
            android:label="@string/app_name" 
            android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

それができたら、アドバイスとして別の Java クラスを作成することにしました。

 package com.example.googlebeacon;

    import org.altbeacon.beacon.BeaconConsumer;
    import org.altbeacon.beacon.BeaconManager;
    import org.altbeacon.beacon.BeaconParser;
    import org.altbeacon.beacon.Identifier;
    import org.altbeacon.beacon.RangeNotifier;
    import org.altbeacon.beacon.Region;
    import org.altbeacon.beacon.powersave.BackgroundPowerSaver;
    import org.altbeacon.beacon.startup.BootstrapNotifier;
    import org.altbeacon.beacon.startup.RegionBootstrap;

    import android.app.Application;
    import android.content.Intent;
    import android.util.Log;
    import android.widget.Toast;

    public class MyRegionApp extends Application implements BootstrapNotifier {
        private final String DebugTag="HOLAREGION";
        private RegionBootstrap regionBootstrap;
        private BackgroundPowerSaver backgroundPowerSaver;
        private BeaconManager mBeaconManager;
        private static final String UUID = "0112234-4556-6778-899a-abbccddeeff0";

        @Override
public void onCreate() {
    super.onCreate();
    Log.d(DebugTag, "App started up");
    mBeaconManager = BeaconManager.getInstanceForApplication(this);
    //BeaconManager.getInstanceForApplication(this).getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));
    mBeaconManager.setBackgroundScanPeriod(1100l);

    mBeaconManager.setBackgroundBetweenScanPeriod(60000l);

    //Region region = new Region("allbeacons", Identifier.parse(UUID) , null, null);
    Region region = new Region("allbeacons", null , null, null);
    //backgroundPowerSaver = new BackgroundPowerSaver(this);

    regionBootstrap = new RegionBootstrap(this, region);
    BeaconManager.getInstanceForApplication(this).getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));
}



        @Override
        public void didDetermineStateForRegion(int arg0, Region arg1) {
            // TODO Auto-generated method stub

        }

        @Override
        public void didEnterRegion(Region arg0) {
            // TODO Auto-generated method stub


            Log.d(DebugTag, "Got a didEnterRegion call");

            regionBootstrap.disable();

            Toast.makeText(getApplicationContext(), "ENTRA EN LA REGION!!!",
                       Toast.LENGTH_LONG).show();

            Intent intent = new Intent(this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            this.startActivity(intent);

        }

        @Override
        public void didExitRegion(Region arg0) {
            // TODO Auto-generated method stub
            Log.d(DebugTag, "Got a didExitRegion call");
        }




    }

そして、私が使用する場合:

// set the duration of the scan to be 1.1 seconds
            //mBeaconManager.setBackgroundScanPeriod(1100l);
         // set the time between each scan to be 1 minute (60 seconds)
            //mBeaconManager.setBackgroundBetweenScanPeriod(60000l);

アプリがクラッシュし、私が持っている MainActivity が表示されません。試してみましたが、すぐに閉じられました。

エラー LogCat: mBeaconManager = BeaconManager.getInstanceForApplication(this); の追加を修正しました。

11-07 14:17:22.791: W/System.err(2125): java.lang.RuntimeException: Unable to create application com.example.googlebeacon.MyRegionApp: java.lang.NullPointerException: Attempt to invoke virtual method 'void org.altbeacon.beacon.BeaconManager.setBackgroundScanPeriod(long)' on a null object reference
11-07 14:17:22.791: W/System.err(2125):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4433)
11-07 14:17:22.791: W/System.err(2125):     at android.app.ActivityThread.access$1500(ActivityThread.java:142)
11-07 14:17:22.791: W/System.err(2125):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1263)
11-07 14:17:22.791: W/System.err(2125):     at android.os.Handler.dispatchMessage(Handler.java:102)
11-07 14:17:22.791: W/System.err(2125):     at android.os.Looper.loop(Looper.java:136)
11-07 14:17:22.791: W/System.err(2125):     at android.app.ActivityThread.main(ActivityThread.java:5118)
11-07 14:17:22.791: W/System.err(2125):     at java.lang.reflect.Method.invoke(Native Method)
11-07 14:17:22.791: W/System.err(2125):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
11-07 14:17:22.791: W/System.err(2125):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:610)
11-07 14:17:22.791: W/System.err(2125): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void org.altbeacon.beacon.BeaconManager.setBackgroundScanPeriod(long)' on a null object reference
11-07 14:17:22.791: W/System.err(2125):     at com.example.googlebeacon.MyRegionApp.onCreate(MyRegionApp.java:31)
11-07 14:17:22.791: W/System.err(2125):     at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
11-07 14:17:22.791: W/System.err(2125):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4430)
11-07 14:17:22.791: W/System.err(2125):     ... 8 more

project.properties に次の行を追加しましたが、まだ機能しません。

manifestmerger.enabled=true

この最後の行を追加すると、アプリを起動すると iBeacon を検出できましたが、スキャン頻度を上げるために setBackground ScanPeriod と BetweenScanPeriod を 1100l と 60000l に設定しましたが、現在はバックグラウンドで動作していますが、表示できません。バックグラウンドで何でも。

例として提供されているサンプル アプリを使用すると、問題なく iBeacon を検出できます (ここからダウンロードhttps://github.com/AltBeacon/android-beacon-library-reference )。

どんな助けでも大歓迎です。私は Android プログラミングの初心者です。少しお待ちください。最善を尽くしています。

よろしく。

イヴァン

4

2 に答える 2