2012-08-09 118 views
0

我是新來的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); 
     } 

} 

希望有人能指點我,什麼是我的錯誤。謝謝

回答

2

這條線從ScanDeviceList.java

if (topView != null) { 
    topView.setText("Name: " + o.getName()); 
    Log.d("getView", o.getName()); 
} 

o.getName()基於這條線在你的logcat null

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) 

在logcat中的片段作爲最後一行上面顯示的是你的崩潰點。

解決方案: 「!UNKNOWN」

if (topView != null) { 
    if (o != null && o.getName() != null){ 
     topView.setText("Name: " + o.getName()); 
     Log.d("getView", o.getName()); 
    }else topView.setText("Name: !UNKNOWN!"); 
} 

你就會知道,如果UI控件topView有串在那裏 - 因爲o.getName()爲空。

+0

非常感謝。問題解決 !!!! :) – 2012-08-10 08:51:40