2016-08-18 3 views
1

APIレベル8のBluetoothデバイスで近くをスキャンするコードを作成しました。しかし今、私はAPIレベル23で同じアプリを使用するつもりですスキャンする。ブルートゥース活動以外にも、他のものは正常に動作しています。誰が仕事がどこに間違っているかを伝えることができますか? は、私は、API 8で動作しますが、APIに上記のAPI 23とのBluetoothやWi-Fiデバイスのための23アンドロイド2.2とアンドロイド6のBluetoothとのインターフェースの相違点

public class MyBluetoothScanActivity extends AppCompatActivity { 
Button bt,bt_count; 
ListView listView; 
BluetoothAdapter btAdapter; 
Set<BluetoothDevice> devicesArray; 
IntentFilter filter; 
BroadcastReceiver receiver; 
ArrayAdapter<String> listAdapter; 
ArrayList<String> pairedDevices; 
ArrayList<BluetoothDevice> devices; 
int count=0; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my_bluetooth_scan); 

    bt=(Button) findViewById(R.id.bT_scan2); 
    bt.setTransformationMethod(null); 

    bt_count=(Button) findViewById(R.id.bt_count); 
    bt_count.setTransformationMethod(null); 

    bt_count.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getBaseContext(),"Count: "+count,Toast.LENGTH_SHORT).show(); 
     } 
    }); 




    listView=(ListView) findViewById(R.id.listViewscan); 

    btAdapter = BluetoothAdapter.getDefaultAdapter(); 
    filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 

    if(!btAdapter.isEnabled()){ 
     turnOnBT(); 
    } 


    init(); 

    bt.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      newScan(); 
     } 
    }); 


    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      if(btAdapter.isDiscovering()){ 
       btAdapter.cancelDiscovery(); 
      } 
      if(!listAdapter.getItem(i).contains("Paired")){ 
       try { 
        BluetoothDevice selectedDevice = devices.get(i); 
        pairDevice(selectedDevice); 
        Thread.sleep(500); 
        newScan(); 
       } 
       catch (Exception e){} 
      } 
      else{ 
       BluetoothDevice selectedDevice = devices.get(i); 
       Intent intent=new Intent(getBaseContext(),BtIns.class); 
       intent.putExtra("MAC",selectedDevice.getAddress()); 
       startActivity(intent); 
      } 
     } 
    }); 
} 

private void newScan(){ 
    btAdapter.cancelDiscovery(); 
    Toast.makeText(getBaseContext(),"New Scan Start",Toast.LENGTH_SHORT).show(); 

    listAdapter= new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1,0); 
    listView.setAdapter(listAdapter); 

    devices = new ArrayList<BluetoothDevice>(); 
    btAdapter.startDiscovery(); 
} 
private void getPairedDevices() { 
    devicesArray = btAdapter.getBondedDevices(); 
    if(devicesArray.size()>0){ 
     for(BluetoothDevice device:devicesArray){ 
      pairedDevices.add(device.getName()); 

     } 
    } 
} 

void turnOnBT(){ 
    Intent intent =new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
    startActivity(intent); 
} 

void init(){ 

    receiver = new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      String action = intent.getAction(); 

      //Toast.makeText(getBaseContext(),"new br: "+action,Toast.LENGTH_LONG).show(); 

      if(BluetoothDevice.ACTION_FOUND.equals(action)){ 

       pairedDevices=new ArrayList<String>(); 
       getPairedDevices(); 
       BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 

       //Toast.makeText(getBaseContext(),"Dev: "+device.getName(),Toast.LENGTH_LONG).show(); 
       devices.add(device); 
       String s = ""; 
       for(int a = 0; a < pairedDevices.size(); a++){ 
        if(device.getName().equals(pairedDevices.get(a))){ 
         //append 
         s = "(Paired)"; 
         break; 
        } 
       } 

       listAdapter.add(device.getName()+" "+s+" "+"\n"+device.getAddress()); 

      } 
      else if(BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){ 
       if(btAdapter.getState() == btAdapter.STATE_OFF){ 
        turnOnBT(); 
       } 
      } 


     } 
    }; 
} 

private void pairDevice(BluetoothDevice device) { 
    try { 
     Method m = device.getClass().getMethod("createBond", (Class[]) null); 
     m.invoke(device, (Object[]) null); 
    } catch (Exception e) { 
     Toast.makeText(getBaseContext(),"Exception: "+e.getMessage(),Toast.LENGTH_LONG).show(); 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    try { 
     unregisterReceiver(receiver); 
     btAdapter.cancelDiscovery(); 
    } 
    catch (Exception e){} 
} 


@Override 
public void onResume() { 
    super.onResume(); 
    try { 
     Toast.makeText(getBaseContext(),"Registration",Toast.LENGTH_SHORT).show(); 
     registerReceiver(receiver, filter); 
     filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
     registerReceiver(receiver, filter); 
     filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
     registerReceiver(receiver, filter); 
     filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); 
     registerReceiver(receiver, filter); 
    } 
    catch (Exception e){} 
}} 

答えて

0

スキャンは、あなたが最初の場所の権限を付与されている必要がないサンプルコードを付属しました。また、[設定]で[場所]が有効になっていることも確認する必要があります。

Google Playサービスを使用すると、ロケーション設定を確認し、SettingsApi.checkLocationSettings() APIを使用して有効にすることができます。

final LocationRequest locationRequest = LocationRequest.create(); 
locationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER); 

final LocationSettingsRequest request = new LocationSettingsRequest.Builder() 
     .addLocationRequest(locationRequest) 
     .setAlwaysShow(true) 
     .setNeedBle(true) 
     .build(); 

mPendingResult = SettingsApi.checkLocationSettings(mClient, request); 

参照:許可を要求するためのhttps://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi

は、あなたが最初にあなたのマニフェストに許可を宣言する必要があり、スキャン前に許可を求めます。 https://developer.android.com/training/permissions/requesting.html

+0

を使ってパーミッションを設定しましたが、まだ問題があります –

+0

これは正しいパーミッションではありません - 'android.permission .ACCESS_COARSE_LOCATION'または 'android.permission.ACCESS_FINE_LOCATION'が必要です。また、実行時にAPI 23以上(ドキュメントに記載されています)の – kcoppock

+0

の問題を解決する必要があります。発見が開始され、結果的に終了するが、デバイスが見つからない。 –