2017-02-18 1 views
-1

Je suivais un tutoriel et essayait de construire une petite application bluetooth android. J'ai suivi les étapes exactes mais j'ai rencontré une erreur en essayant d'exécuter l'application. Le code a été joint ci-dessous. S'il vous plaît aidez-moi à résoudre ce problème de récepteur non enregistré.Bluetooth a divulgué IntentReceiver. Vous manquez un appel à unregisterReceiver()?

package com.example.sparky.bluetoothtestapp; 

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.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.Set; 

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { 

    ArrayAdapter<String> listAdapter; 
    ListView listView; 
    Button connectNew; 
    BluetoothAdapter btAdapter; 
    Set<BluetoothDevice> devicesArray; 
    ArrayList<String> pairedDevices; 
    IntentFilter filter; 
    BroadcastReceiver receiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 

     init(); 
     if(btAdapter==null){ 
      Toast.makeText(getApplicationContext(), "Bluetooth Adapter Not Found!", Toast.LENGTH_LONG); 
      finish(); 
     } 
     else{ 
      if(!btAdapter.isEnabled()){ 
       turnOnBT(); 
      } 
      getPairedDevices(); 
      startDiscovery(); 
     } 
    } 

    private void startDiscovery() { 
     btAdapter.cancelDiscovery(); 
     btAdapter.startDiscovery(); 
    } 

    private void turnOnBT() { 
     Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
     startActivityForResult(intent, 1); 
    } 

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

    private void init() { 
     listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, 0); 
     listView = (ListView)findViewById(R.id.listView); 
     listView.setOnItemClickListener(this); 
     connectNew = (Button)findViewById(R.id.bConnectNew); 
     listView.setAdapter(listAdapter); 
     btAdapter.getDefaultAdapter(); 
     pairedDevices = new ArrayList<String>(); 
     IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 
     receiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       String action = intent.getAction(); 
       if(BluetoothDevice.ACTION_FOUND.equals(action)){ 
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
        listAdapter.add(device.getName()+"\n"+device.getAddress()); 
        String s = ""; 
        for(int j=0; j<pairedDevices.size(); j++){ 
         if(device.getName().equals(pairedDevices.get(j))){ 
          s = "(Paired)"; 
          break; 
         } 
        } 
        listAdapter.add(device.getName()+" "+s+" \n"+device.getAddress()); 
       } 
       else if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){ 
        // Add code 
       } 
       else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){ 

       } 
       else if(BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){ 
        if(btAdapter.getState() == btAdapter.STATE_OFF){ 
         turnOnBT(); 
        } 
       } 
      } 
     }; 
     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); 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(receiver); 
    } 

    @Override 
    protected void onStop() { 
     unregisterReceiver(receiver); 
     super.onStop(); 
    } 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(resultCode == RESULT_CANCELED){ 
      Toast.makeText(getApplicationContext(), "Bluetooth must be enabled", Toast.LENGTH_SHORT); 
      finish(); 
     } 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     if(listAdapter.getItem(position).contains("(Paired)")){ 
      Toast.makeText(getApplicationContext(), "Device is paired", Toast.LENGTH_SHORT).show(); 
     } 
     else{ 
      Toast.makeText(getApplicationContext(), "Device is not paired", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

J'ai également joint les journaux.

02/18 23:59:21: Launching app 
Cold swapped changes. 
$ adb shell am start -n "com.example.sparky.bluetoothtestapp/com.example.sparky.bluetoothtestapp.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER 
Connected to process 17545 on device sony-c6603-BX903JZAQZ 
W/ResourceType: Found multiple library tables, ignoring... 
W/ResourceType: Found multiple library tables, ignoring... 
I/InstantRun: Instant Run Runtime started. Android package is com.example.sparky.bluetoothtestapp, real application class is null. 
W/art: Failed to find OatDexFile for DexFile /data/data/com.example.sparky.bluetoothtestapp/files/instant-run/dex/slice-slice_4-classes.dex (canonical path /data/data/com.example.sparky.bluetoothtestapp/files/instant-run/dex/slice-slice_4-classes.dex) with checksum 0x6beeb489 in OatFile /data/data/com.example.sparky.bluetoothtestapp/cache/slice-slice_4-classes.dex 
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
E/ActivityThread: Activity com.example.sparky.bluetoothtestapp.MainActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
        android.app.IntentReceiverLeaked: Activity com.example.sparky.bluetoothtestapp.MainActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
         at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:909) 
         at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:710) 
         at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1664) 
         at android.app.ContextImpl.registerReceiver(ContextImpl.java:1644) 
         at android.app.ContextImpl.registerReceiver(ContextImpl.java:1638) 
         at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:489) 
         at com.example.sparky.bluetoothtestapp.MainActivity.init(MainActivity.java:125) 
         at com.example.sparky.bluetoothtestapp.MainActivity.onCreate(MainActivity.java:54) 
         at android.app.Activity.performCreate(Activity.java:5990) 
         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332) 
         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 
         at android.app.ActivityThread.access$800(ActivityThread.java:156) 
         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:211) 
         at android.app.ActivityThread.main(ActivityThread.java:5389) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:372) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
W/art: Suspending all threads took: 42.694ms 

Répondre

0

Ajoutez le code suivant:

@Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     try{ 
      if(receiver!=null) 
       unregisterReceiver(receiver); 
     }catch(Exception e) 
     { 
     } 
     super.onDestroy();  
    } 

Hope this helps.

+0

Non. N'a pas fonctionné. L'erreur est toujours là. – user3604437