简体   繁体   中英

Bluetooth Permission Dialog multiplication

I have encountered strange issue. From Activity I request Bluetooth activation and 300s discoverability via intent:

Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);                        
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);

I use it no matter if the Bluetooth is already activated or not. By doing that, a dialog permission shows off like expected:

"Bluetooth permission request: An application on your phone is requesting permission to turn on Bluetooth and ..."

But no matter if i put yes or no, the dialog persists to appear multiple times. I dont know why. My code:

public class Initial extends Activity {

 private Integer REQUEST_ENABLE_BT  = 1;
 private Integer REQUEST_ENABLE_DISCBT  = 2;
 private ListView listView;
 private  ArrayAdapter<String> mArrayAdapter;
 TextView editText;
 private Global global;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_initial);
    this.global= ((Global)this.getApplicationContext());
    editText = (TextView) findViewById(R.id.textView1);     
    global.setAdapter(BluetoothAdapter.getDefaultAdapter());
    if (global.getAdapter() == null) {
        // Device does not support Bluetooth
        editText.setText("Erro: Sistema não suporta Bluetooth!");
        finish();
    }
    listView = (ListView) findViewById(R.id.list);
    mArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1);
    listView.setAdapter(mArrayAdapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.initial, menu);
    return true;
}

@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first
    if(!global.getEstado()){
        if (!global.getAdapter().isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }
        else
            editText.setText("Bluetooth Ligado!");
        global.setReceiver(new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                // When discovery finds a device
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    // Get the BluetoothDevice object from the Intent
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    // Add the name and address to an array adapter to show in a ListView
                    mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                    Thread novocliente = new novoCliente(device);
                    novocliente.start();
                }
            }
        });
        // Register the BroadcastReceiver
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(global.getReceiver(), filter); // Don't forget to unregister during onDestroy
        global.getAdapter().startDiscovery();
    }
    else{   
            Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
            startActivity(discoverableIntent);
    }   
}

@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == REQUEST_ENABLE_BT){
        switch(resultCode){
        case RESULT_OK:     editText.setText("Bluetooth Ligado!");break;
        case RESULT_CANCELED:   editText.setText("Impossivel ligar Bluetooth!");finish();break;
        }   
    }
    if(requestCode == REQUEST_ENABLE_DISCBT){
        switch(resultCode){
            case RESULT_CANCELED:   editText.setText("Bluetooth não Detetável!");break;
            default :   editText.setText("Bluetooth Detetável por "+resultCode+" segundos!");
                        Thread servidor = new ServerSocket();
                        servidor.start();
            break;
        }   
    }
}

@Override
public void onStop() {
    super.onStop();  // Always call the superclass method first
    BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
    BluetoothAdapter.getDefaultAdapter().disable(); 
}

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass method first
    unregisterReceiver(global.getReceiver()); // Don't forget to unregister during onDestroy    

}

} My variaable getEstado() is a boolean that indicates if the application will be server or client. if is true it is server. and it is in the else that is the problem.

Can anyone help me please?

Your code to enable is in onResume(). When the dialog is shown, your activity is paused, and when it is dismissed (either positively or negatively), your activity is resumed. If the dialog is positive then it also will take a moment to enable the BT adaptor, so global.getAdapter().isEnabled() will still return false. This is why you are getting the dialog repeatedly show.

To resolve this you need to either use a different trigger (why did you specificaly need to use onResume? Could you put it in onCreate), or you could possible store state. Something like:

private boolean requestedEnable = false;

@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first
    if(!global.getEstado()){
        if (!global.getAdapter().isEnabled()) {
            if(!requestedEnable){
                requestedEnable = true;
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }
        }
        else
            editText.setText("Bluetooth Ligado!");
        global.setReceiver(new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                // When discovery finds a device
                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                    // Get the BluetoothDevice object from the Intent
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    // Add the name and address to an array adapter to show in a ListView
                    mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
                    Thread novocliente = new novoCliente(device);
                    novocliente.start();
                }
            }
        });
        // Register the BroadcastReceiver
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(global.getReceiver(), filter); // Don't forget to unregister during onDestroy
        global.getAdapter().startDiscovery();
    }
    else{   
            Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
            startActivity(discoverableIntent);
    }   
}

I hope you find this helpful.

看一下蓝牙聊天示例,可能会有所帮助

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM