-1
我正在關注一個教程,並試圖構建一個小的Android藍牙應用程序。我遵循了確切的步驟,但在嘗試運行應用程序時遇到了錯誤。代碼已附在下面。請幫我解決這個未註冊的接收器問題。藍牙泄露的IntentReceiver。你是否錯過了對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();
}
}
}
我也附加了日誌。
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
沒有。沒有工作。錯誤仍然存在。 – user3604437