2015-09-28 82 views
1

和以前一樣,我與Android燈塔圖書館工作,onBeaconServiceConnect不叫

它已經工作,我也發現了通過BLE燈塔 - 藍牙低功耗,

但是現在,經過更新到庫的最新版本,現在方法onBeaconServiceConnect()不再運行。

請告訴我,我需要做的,做它的工作原理,

謝謝

P/S:代碼:

的Manifest.xml

<uses-feature 
    android:name="android.hardware.bluetooth_le" 
    android:required="true" /> 

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

<service 
     android:name="org.altbeacon.beacon.service.BeaconService" 
     android:enabled="true" 
     android:isolatedProcess="false" 
     android:label="beacon" /> 
<service 
     android:name="org.altbeacon.beacon.BeaconIntentProcessor" 
     android:enabled="true" /> 

Java

public class FoundBeaconFragment extends Fragment 
    implements BeaconConsumer { 

@Override 
public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) { 
    return false; 
} 

@Override 
public Context getApplicationContext() { 
    return getActivity(); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_found_beacon, null); 

    // Set adapter 
    foundBeaconAdapter = new FoundBeaconAdapter(
      getActivity(), 
      R.layout.simple_list_item_found_beacon, 
      mAlFoundBeacon); 
    mLvFoundBeacon.setAdapter(foundBeaconAdapter); 

    // Register Scan beacons feature 
    register(); 

    return v; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    try { 
     // Unbind scan beacon progress 
     if (beaconManager != null) 
      beaconManager.unbind(this); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void unbindService(ServiceConnection serviceConnection) { 

} 

// CUSTOM METHODS 
private void register() { 
    beaconManager = BeaconManager.getInstanceForApplication(getActivity()); 
    // To detect proprietary beacons, you must add a line like below corresponding to your beacon 
    // type. Do a web search for "setBeaconLayout" to get the proper expression. 
    try { 
     // todo 
     beaconManager.getBeaconParsers().add(new BeaconParser(). 
       setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    // CAN SEE THIS LOG CAT, NO EXCEPTION 
    Log.i("", "Register Service"); 

    beaconManager.bind(this); 
} 

@Override 
public void onBeaconServiceConnect() { 
    beaconManager.setRangeNotifier(new RangeNotifier() { 
     @Override 
     public void didRangeBeaconsInRegion(
       Collection<org.altbeacon.beacon.Beacon> beacons, Region region) { 
      Log.i("", "IS_SCAN_BEACON " + FoundBeaconFragment.IS_SCAN_BEACON); 

      if (FoundBeaconFragment.IS_SCAN_BEACON) { 
       Log.i("", "Found " + beacons.size() + " beacon!"); 

       if (beacons.size() > 0) { 
        /** 
        * Begin transfer data 
        */ 
        for (final org.altbeacon.beacon.Beacon beacon : beacons) { 
         getActivity().runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           getDataViaBLE(getActivity(), beacon.getId1() + "", 
             beacon.getId2() + "", beacon.getId3() + ""); 
          } 
         }); 
        } 
       } 
      } 
     } 
    }); 

    try { 
     beaconManager.startRangingBeaconsInRegion(
       new Region(Constant.UUID, null, null, null)); 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
} 

public static String UUID = "01122334-4556-6778-899a-abbccddeeff0"; 

ANSWER

由於我使用FragmentActivity從庫的示例代碼。

所以我需要做這些改變:

@Override 
public Context getApplicationContext() { 
    return getActivity().getApplicationContext(); 
} 

@Override 
public void unbindService(ServiceConnection serviceConnection) { 
    getActivity().unbindService(serviceConnection); 
} 

@Override 
public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) { 
    return getActivity().bindService(intent, serviceConnection, i); 
} 
+0

您能捕獲並附加一個LogCat摘錄,其中包括「註冊服務」之前和之後的行嗎? – davidgyoung

+0

@davidgyoung對不起,但它顯示正確的Logcat「註冊服務」,沒有發現異常。 –

+0

你可以爲'getApplicationContext','bindService'和'unbindService'顯示'FoundBeaconFragement'方法定義嗎? – davidgyoung

回答

9

如果你是實施BeaconConsumer接口在Fragment(而不是ActivityServiceApplication實例)中,您需要鏈接所有方法。像這樣:

@Override 
public Context getApplicationContext() { 
    return getActivity().getApplicationContext(); 
} 

@Override 
public void unbindService(ServiceConnection serviceConnection) { 
    getActivity().unbindService(serviceConnection); 
} 

@Override 
public boolean bindService(Intent intent, ServiceConnection serviceConnection, int i) { 
    return getActivity().bindService(intent, serviceConnection, i); 
} 
+0

完全正確。非常感謝你。 –

2

我不sure.before幾天,這盞代碼工作me.please check.if任何問題,我會送我的整個代碼。

試試這個:

beaconManager.startRangingBeaconsInRegion(new Region("myBeaons", Identifier.parse(UUID), null, null)); 

,而不是這一行代碼。

beaconManager.startRangingBeaconsInRegion(
       new Region(Constant.UUID, null, null, null)); 
+0

對不起,它不起作用。我已經改變了你。我的意思是'onBeaconServiceConnect()'沒有調用,如何運行你的代碼? –

0

此代碼工作me.please試試這個代碼:

創建應用程序類別:

public class BeaconReferenceApplication extends Application implements BootstrapNotifier { 
    private BackgroundPowerSaver backgroundPowerSaver; 
    private boolean haveDetectedBeaconsSinceBoot = false; 
    private MonitoringActivity monitoringActivity = null; 
    private String UUID = "23542266-18D1-4FE4-B4A1-23F8195B9D39"; 


    private static final String TAG = ".MyApplicationName"; 
    private RegionBootstrap regionBootstrap; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d(TAG, "App started up"); 
     BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); 
     // To detect proprietary beacons, you must add a line like below corresponding 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) 
     Region region = new Region("com.example.myapp.boostrapRegion", null, null, null); 
     regionBootstrap = new RegionBootstrap(this, region); 
    } 

    @Override 
    public void didDetermineStateForRegion(int arg0, Region arg1) { 
     // Don't care 
    } 

    @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); 
     // IMPORTANT: in the AndroidManifest.xml definition of this activity, you must set android:launchMode="singleInstance" or you will get two instances 
     // created when a user launches the activity manually and it gets launched from here. 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     this.startActivity(intent); 
    } 

    @Override 
    public void didExitRegion(Region arg0) { 
     // Don't care 
    } 
} 

活動課

public class MainActivity extends Activity implements BeaconConsumer { 

    public static final String TAG = "BeaconsEverywhere"; 
    private BeaconManager beaconManager; 
    private String UUID = "23542266-18D1-4FE4-B4A1-23F8195B9D39"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     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,d:25-25")); 

     beaconManager.bind(this); 

    } 

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

    @Override 
    public void onBeaconServiceConnect() { 
     final Region region = new Region("myBeaons", Identifier.parse(UUID), null, null); 

     beaconManager.setMonitorNotifier(new MonitorNotifier() { 
      @Override 
      public void didEnterRegion(Region region) { 
       try { 
        Log.d(TAG, "didEnterRegion"); 
        beaconManager.startRangingBeaconsInRegion(region); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void didExitRegion(Region region) { 
       try { 
        Log.d(TAG, "didExitRegion"); 
        beaconManager.stopRangingBeaconsInRegion(region); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void didDetermineStateForRegion(int i, Region region) { 

      } 
     }); 

     beaconManager.setRangeNotifier(new RangeNotifier() { 
      @Override 
      public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
       for (Beacon oneBeacon : beacons) { 
        Log.d(TAG, "distance: " + oneBeacon.getDistance() + " id:" + oneBeacon.getId1() + "/" + oneBeacon.getId2() + "/" + oneBeacon.getId3()); 
       } 
      } 
     }); 

     try { 
      beaconManager.startMonitoringBeaconsInRegion(region); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+0

<使用權限android:name =「android.permission.BLUETOOTH」/> <使用權限android:name =「android.permission。 BLUETOOTH_ADMIN「/> – dipali

+0

在manifesf文件中添加上述權限。 – dipali

+0

謝謝你的代碼。區別只在於你使用'Activity',我使用'Fragment'。你認爲這是原因嗎?我沒有看到更多的差異。嗯 –