2017-10-04 40 views
2

altbeaconが提供する参照コードを使用しましたが、iBeaconsを検出できませんでした。以下は私のコードです:altbeacon androidライブラリで検出されないiBeacons

マニフェストに以下の許可が含まれています。これらに加えて、位置情報サービスも有効にしました。アクティビティ

super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_ranging); 
beaconManager = BeaconManager.getInstanceForApplication(this); 
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
beaconManager.bind(this); 

onBeaconServiceConnecrはRangeNotifier(下記のコードでコメント)MoniterNotifierの両方を使用してみましたが、両方が機能しなかったため

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.BLUETOOTH"/> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 

のonCreate方法。 RangeNotifierは常にサイズゼロのコレクションを持ち、MoniterNotifierは決して呼び出されません。

@Override 
public void onBeaconServiceConnect() { 
    //BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); 
    beaconManager.addRangeNotifier(new RangeNotifier() { 
     @Override 
     public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) { 
      if(collection.size() > 0){ 
      for (Beacon beacon : collection) { 
        Log.i("MainActivity", "I see a beacon that is about "+beacon.getDistance()+" meters away."); 
       } 
      } 
     } 
    }); 


    /*beaconManager.addMonitorNotifier(new MonitorNotifier() { 
     @Override 
     public void didEnterRegion(Region region) { 
      Log.i(TAG, "I just saw an beacon for the first time!"); 
     } 

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

     @Override 
     public void didDetermineStateForRegion(int state, Region region) { 
      Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state); 
     } 
    });*/ 

    try { 
     beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)); 
    } catch (RemoteException e) { } 
} 

あなたの助け、感謝を感謝しています。

答えて

1

the documentationのように、api-23以降をターゲットとし、Android 6以降で実行している場合は、実行時にLocation権限をリクエストする必要があります。

super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_ranging); 
    if (checkLocationPermission()) { 
     beaconManager = BeaconManager.getInstanceForApplication(this); 
     beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
     beaconManager.bind(this); 
    } 

必要に応じてcheckLocationPermission()方法は、ユーザが要求されますし、ユーザーは場所の許可を受け入れた場合、次のことができます。ユーザーはすでに場所permisionを付与している場合

だから、唯一onCreate()でBeaconManagerを初期化しますBeaconManagerを初期化します。

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 

public boolean checkLocationPermission() { 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_COARSE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_COARSE_LOCATION)) { 

      // Show an explanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 
      new AlertDialog.Builder(this) 
        .setTitle(R.string.title_location_permission) 
        .setMessage(R.string.text_location_permission) 
        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialogInterface, int i) { 
          //Prompt the user once explanation has been shown 
          ActivityCompat.requestPermissions(MainActivity.this, 
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
            MY_PERMISSIONS_REQUEST_LOCATION); 
         } 
        }) 
        .create() 
        .show(); 


     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 
     } 
     return false; 
    } else { 
     return true; 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // location-related task you need to do. 
       if (ContextCompat.checkSelfPermission(this, 
         Manifest.permission.ACCESS_COARSE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 

        //Set up the BeaconManager 
        beaconManager = BeaconManager.getInstanceForApplication(this); 
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
        beaconManager.bind(this); 
       } 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 

      } 
      return; 
     } 

    } 
} 
関連する問題