2016-04-06 11 views
0

定期的に使用可能なBluetoothデバイスをリストしようとしています。アイデアは、startDiscovery()関数を4秒ごとに実行し、可視デバイスをリストすることです。Android Bluetoothディスカバリーが動作しない

package com.neondude.cupid; 

import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import java.util.ArrayList; 
import java.util.Timer; 
import java.util.TimerTask; 

public class MainActivity extends Activity { 

    Timer mTimer; 
    private ListView listView; 
    private ArrayList<String> mDeviceList = new ArrayList<String>(); 
    private BluetoothAdapter mBluetoothAdapter; 
    private ArrayAdapter<String> BTArrayAdapter; 
    Handler mHandler = new Handler(); 

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

     listView = (ListView) findViewById(R.id.listView); 
     BTArrayAdapter = new ArrayAdapter<String>(this,R.layout.list_view); 
     listView.setAdapter(BTArrayAdapter); 

     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
     registerReceiver(mReceiver, filter); 
    } 

    private void startTimer(){ 
     mTimer = new Timer(); 
     mTimer.scheduleAtFixedRate(new Mytask(), 4000, 1000 * 5); 
    } 

    class Mytask extends TimerTask { 
     @Override 
     public void run(){ 
      mHandler.post(new Runnable(){ 
       @Override 
       public void run(){ 

        find(); 

       } 
      }); 
     } 
    } 

    public void find(){ 

     if (mBluetoothAdapter.isDiscovering()) { 
      mBluetoothAdapter.cancelDiscovery(); 
     } 
     else { 
      BTArrayAdapter.clear(); 
      mBluetoothAdapter.startDiscovery(); 

      registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); 
     } 
     mBluetoothAdapter.startDiscovery(); 

    } 

    final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (BluetoothDevice.ACTION_FOUND.equals(action)) 
      { 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
       short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI,Short.MIN_VALUE); 

       BTArrayAdapter.add(device.getName() + "\n" + device.getAddress() + "\n" + rssi); 
       BTArrayAdapter.notifyDataSetChanged(); 

      } 
     } 
    }; 

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



} 

私はstartDiscovery()関数をtimertaskハンドラに含めました。しかし、私はこれを行うと、デバイスと私のリストビューに記載されていません。

答えて

0

タイマーを開始することができますしたがって、timerTaskは開始しません。

0

あなたはBluetoothがオンになっているかどうかをチェックし、オフのときにオンするようユーザーに依頼する必要があります。

if (!mBluetoothAdapter.isEnabled()) { 
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
} 
else{ 

    startTimer(); 

} 

あなたはstartTimer()関数が呼び出されることはありませんonActivityResult()

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Check which request we're responding to 
     if (resultCode == RESULT_OK) { 
      // The user turn on the bluetooth 
      startTimer(); 
     } 
    } 
} 
+0

アプリを実行する前にBluetoothをオンにしました。私は 'startDiscovery()'関数がtimerTaskの外にあるときにデバイスをリストすることができます。 – neondude

+0

ディスカバリーをキャンセルする必要がありますか?5秒ごとに再度開始しますか? –

+0

ありがとうございます。私は問題を見つけた、私はstartimer()関数をどこでも呼び出さなかった。 – neondude

関連する問題