我是 android 和 java 程序的新手。
我正在尝试编写一个程序来通过 Android HP 蓝牙远程控制开关。
一切都很好,只有我对蓝牙功能/活动的扫描确实会随机强制退出。我不确定我的代码发生了什么/错误,因此我希望有人可以相应地帮助/建议我。下面是我提取的 logcat 文件。
08-08 17:23:40.035: D/getView(1876): WindowsCE
08-08 17:23:40.035: D/getView(1876): WindowsCE
08-08 17:23:42.949: E/BluetoothEventLoop.cpp(107): event_filter: Received signal org.bluez.Adapter:DeviceFound from /org/bluez/1610/hci0
08-08 17:23:42.953: D/BluetoothService(107): updateDeviceServiceChannelCache(00:15:A0:6B:BB:1B)
08-08 17:23:42.980: V/BluetoothEventRedirector(450): Received android.bluetooth.device.action.FOUND
08-08 17:23:42.988: D/getView(1876): WindowsCE
08-08 17:23:42.988: D/AndroidRuntime(1876): Shutting down VM
08-08 17:23:42.988: W/dalvikvm(1876): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-08 17:23:42.992: E/AndroidRuntime(1876): FATAL EXCEPTION: main
08-08 17:23:42.992: E/AndroidRuntime(1876): java.lang.NullPointerException: println needs a message
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.util.Log.println_native(Native Method)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.util.Log.d(Log.java:137)
08-08 17:23:42.992: E/AndroidRuntime(1876): at com.android.ui.single.ScanDeviceList.getView(ScanDeviceList.java:61)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.AbsListView.obtainView(AbsListView.java:1409)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.ListView.measureHeightOfChildren(ListView.java:1216)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.ListView.onMeasure(ListView.java:1127)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.View.measure(View.java:8313)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.View.measure(View.java:8313)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.View.measure(View.java:8313)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.View.measure(View.java:8313)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.View.measure(View.java:8313)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.os.Handler.dispatchMessage(Handler.java:99)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.os.Looper.loop(Looper.java:123)
08-08 17:23:42.992: E/AndroidRuntime(1876): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-08 17:23:42.992: E/AndroidRuntime(1876): at java.lang.reflect.Method.invokeNative(Native Method)
08-08 17:23:42.992: E/AndroidRuntime(1876): at java.lang.reflect.Method.invoke(Method.java:507)
08-08 17:23:42.992: E/AndroidRuntime(1876): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-08 17:23:42.992: E/AndroidRuntime(1876): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-08 17:23:42.992: E/AndroidRuntime(1876): at dalvik.system.NativeStart.main(Native Method)
08-08 17:23:42.999: W/ActivityManager(107): Force finishing activity com.android/.DogActivity
08-08 17:23:43.499: W/ActivityManager(107): Activity pause timeout for HistoryRecord{408014c0 com.android/.DogActivity}
08-09 21:32:27.968: D/SurfaceFlinger(107): About to give-up screen, flinger = 0x11df90
08-09 21:41:54.546: D/SntpClient(107): request time failed: java.net.UnknownHostException: north-america.pool.ntp.org
08-09 21:41:54.554: D/SntpClient(107): request time failed: java.net.UnknownHostException: north-america.pool.ntp.org
08-09 21:41:54.554: D/SntpClient(107): request time failed: java.net.UnknownHostException: north-america.pool.ntp.org
08-09 21:41:54.617: D/skia(107): purging 201K from font cache [12 entries]
下面是我的 DogActivity 代码
package com.android;
import java.io.FileOutputStream;
import com.android.backend.data.bluetooth.BluetoothManager;
import com.android.ui.UIManager;
import com.android.ui.single.ScanDeviceList;
import android.app.Activity;
import android.app.Dialog;
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.text.Editable;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
public class DogActivity extends Activity {
public BroadcastReceiver mRvc = new BroadcastReceiver(){ // The new is instantiate the class **always read from the back
// The line from the back is creating an instantiate of this class
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// If it's already paired, skip it, because it's been listed
// already
// Bluetooth Manager Update
BluetoothManager.getInstance().addDiscovered_Devices(device);
// UI Manager Update
UI_discovered_Devices.add(device);
}
if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
uiMgr.hideScanningProgressBox();
}
}
};
public ScanDeviceList UI_discovered_Devices;
public UIManager uiMgr = new UIManager();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.overallscanentrylayout);
uiMgr.owner = this;
final DogActivity tt = this;
// set your list view
UI_discovered_Devices = new ScanDeviceList(this,R.layout.overallscanitemlayout);
UI_discovered_Devices.set_view(R.id.toptexto1, R.id.bottomtexto1);
ListView discoverListView = (ListView) findViewById(R.id.clistView1);
UI_discovered_Devices.clear(); ///////////// Testing to solve memory issue
discoverListView.setAdapter(UI_discovered_Devices);
discoverListView
.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent,
View view, int position, long id) {
// getItem = retrieving item from UI_discovered_Devices
// Arraylist
final BluetoothDevice getItem = UI_discovered_Devices
.getItem((int) id);
final Dialog dialog_createPL = new Dialog(tt);
dialog_createPL.setContentView(R.layout.catdogname);
Button okButt = (Button) dialog_createPL
.findViewById(R.id.catdogok);
okButt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText edit1 = (EditText) dialog_createPL
.findViewById(R.id.catdogtext1);
Editable ret = edit1.getText();
String ls = ret.toString();
// Start activity
startActivity(new Intent(tt,
ManualActivity.class));
// Write message to text
String msg = ls + "," + getItem.getName() + ","
+ getItem.getAddress();
writeDataToMem(msg);
}
});
Button cancelButt = (Button) dialog_createPL
.findViewById(R.id.catdogcancel);
cancelButt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog_createPL.cancel();
}
});
dialog_createPL.setTitle("Enter Name for Bluetooth Device");
dialog_createPL.show();
return false;
}
});
discoverListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
final BluetoothDevice getItem = UI_discovered_Devices
.getItem((int) id);
final Dialog dialog_createPL = new Dialog(tt);
dialog_createPL.setContentView(R.layout.catdogname);
Button okButt = (Button) dialog_createPL
.findViewById(R.id.catdogok);
okButt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText edit1 = (EditText) dialog_createPL
.findViewById(R.id.catdogtext1);
Editable ret = edit1.getText();
String ls = ret.toString();
// Start activity
startActivity(new Intent(tt,
ManualActivity.class));
// Write message to text
String msg = ls + "," + getItem.getName() + ","
+ getItem.getAddress();
writeDataToMem(msg);
}
});
Button cancelButt = (Button) dialog_createPL
.findViewById(R.id.catdogcancel);
cancelButt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog_createPL.cancel();
}
});
dialog_createPL.setTitle("Enter Name for Bluetooth Device");
dialog_createPL.show();
}
});
// Register for broadcasts when a device is discovered
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); // IntentFilter class is important to declare for below filter
registerReceiver(mRvc,filter); //mRvc is the location of logic, filter is message identify by android
// Register for broadcasts when discovery has finished
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); //Must make sure the IntentFilter is declare
registerReceiver(mRvc,filter); //mRvc is the location of logic, filter message indetiy by android
// // Logic
BluetoothManager.getInstance().doDiscovery();
uiMgr.showScanningProgressBox();
// uiMgr.clearUIDiscovered_Devices();
}
public void writeDataToMem(String msg) {
// Write playlist to database
FileOutputStream fos;
try {
fos = this.openFileOutput("bone.txt", Context.MODE_PRIVATE);
fos.write(msg.getBytes());
Log.d("bone.txt", msg);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
msg = msg +"\n";
fos = this.openFileOutput("fish.txt", Context.MODE_APPEND);
fos.write(msg.getBytes());
Log.d("fish.txt", msg);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
protected void onResume() { //restart bluetooth is accidently off it
super.onResume();
// The activity has become visible (it is now "resumed").
BluetoothManager.getInstance().init();
BluetoothManager.getInstance().getBluetoothAdapter().enable();
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); // IntentFilter class is important to declare for below filter
registerReceiver(mRvc,filter); // mRvc is the location of logic, filter is message identify by android
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); //Must make sure the IntentFilter is declare
registerReceiver(mRvc,filter);
}
protected void onPause() { // Clear all mac address **is a trial for memory leak
super.onPause();
BluetoothManager.getInstance().ccDiscovery();
BluetoothManager.getInstance().clearDiscoveredDevices();
uiMgr.hideScanningProgressBox();
unregisterReceiver(mRvc);
}
}
下面是我的 ScanDeviceList 代码
package com.android.ui.single;
//import java.util.ArrayList;
import java.util.Set;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
//import android.widget.CompoundButton;
//import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
//import android.widget.ToggleButton;
//import com.android.R;
//import com.android.ScanListActivity;
//import com.android.backend.data.bluetooth.BluetoothManager;
public class ScanDeviceList extends ArrayAdapter<BluetoothDevice> {
Context context;
int layoutResourceID;
int topViewID;
int bottomViewID;
public ScanDeviceList(Context context, int textViewResourceId) {
super(context, textViewResourceId);
this.context = context;
layoutResourceID = textViewResourceId;
}
// public ScanDeviceList(Context context, int textViewResourceId, ArrayList<BluetoothDevice> items) {
// super(context, textViewResourceId, items);
// this.context = context;
// layoutResourceID = textViewResourceId;
// }
public void set_view(int passtopView, int passBottomView){
topViewID = passtopView;
bottomViewID = passBottomView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(layoutResourceID, null);
}
TextView topView = (TextView) v.findViewById(topViewID);
TextView bottomView = (TextView) v.findViewById(bottomViewID);
final BluetoothDevice o = this.getItem(position);
// Get the local Bluetooth adapter
BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
// Get a set of currently paired devices
Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
//if (o != null)
if (pairedDevices.size() > 0)
{
if (topView != null) {
topView.setText("Name: " + o.getName());
Log.d("getView", o.getName());
}
if (bottomView != null) {
String msg = "MAC: " + o.getAddress();
if(o.getBondState() == BluetoothDevice.BOND_BONDED)
{msg = msg + "/" + "Paired";}
else
{msg = msg + "/" + "Not Paired";}
bottomView.setText(msg);
}
}
return (v);
}
}
希望有人可以告诉我我的错误是什么。谢谢你