Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android蓝牙发现不工作_Java_Android - Fatal编程技术网

Java Android蓝牙发现不工作

Java Android蓝牙发现不工作,java,android,Java,Android,我正在尝试定期列出可用的蓝牙设备。我们的想法是每4秒运行一次startDiscovery()功能,并列出可见的设备 package com.neondude.cupid; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import

我正在尝试定期列出可用的蓝牙设备。我们的想法是每4秒运行一次startDiscovery()功能,并列出可见的设备

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();
   }



}
package com.neondude.cupid;
导入android.app.Activity;
导入android.bluetooth.BluetoothAdapter;
导入android.bluetooth.bluetooth设备;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.content.IntentFilter;
导入android.os.Bundle;
导入android.os.Handler;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入java.util.ArrayList;
导入java.util.Timer;
导入java.util.TimerTask;
公共类MainActivity扩展了活动{
定时器;
私有列表视图列表视图;
private ArrayList mDeviceList=new ArrayList();
私人蓝牙适配器mBluetoothAdapter;
专用阵列适配器BTArrayAdapter;
Handler mHandler=新的Handler();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(listView)findViewById(R.id.listView);
BTArrayAdapter=新的ArrayAdapter(这个,R.layout.list\u视图);
setAdapter(BTArrayAdapter);
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
IntentFilter筛选器=新的IntentFilter(BluetoothDevice.ACTION\u已找到);
registerReceiver(mrReceiver,过滤器);
}
私有void startTimer(){
mTimer=新计时器();
mTimer.scheduleAtFixedRate(newmytask(),40001000*5);
}
类Mytask扩展TimerTask{
@凌驾
公开募捐{
mHandler.post(新Runnable(){
@凌驾
公开募捐{
查找();
}
});
}
}
公共无效查找(){
if(mBluetoothAdapter.isDiscovering()){
mBluetoothAdapter.cancelDiscovery();
}
否则{
BTArrayAdapter.clear();
mBluetoothAdapter.startDiscovery();
registerReceiver(mReceiver,newintentfilter(BluetoothDevice.ACTION_-FOUND));
}
mBluetoothAdapter.startDiscovery();
}
最终广播接收器mReceiver=新广播接收器(){
公共void onReceive(上下文、意图){
String action=intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(ACTION))
{
BluetoothDevice=intent.getParcelableExtra(BluetoothDevice.EXTRA\u设备);
short-rssi=intent.getShortExtra(BluetoothDevice.EXTRA\rssi,short.MIN\u值);
BTArrayAdapter.add(device.getName()+“\n”+device.getAddress()+“\n”+rssi);
BTArrayAdapter.notifyDataSetChanged();
}
}
};
@凌驾
受保护的空onDestroy(){
未注册接收人(mReceiver);
super.ondestory();
}
}

我在timertask处理程序中包含了startDiscovery()函数。但当我执行此操作时,设备和未在我的列表视图中列出。

您应该检查蓝牙是否已打开,如果已关闭,请用户打开:

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

    startTimer();

}
您可以在ActivityResult()上启动计时器


startTimer()
函数从未被调用,因此timerTask不会开始。

在运行应用程序之前,我打开了蓝牙。当
startDiscovery()
函数超出timerTask时,我可以列出设备。是否需要取消查找并每5秒重新启动一次?感谢您指出这一点。我发现了问题,我没有在任何地方调用startimer()函数。
@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();
        }
    }
}