2016-03-02 88 views
0

尝试连接到设备时,应用程序(OBDII阅读器应用程序)崩溃。我有我的MainActivity BTHandler类,其中BTHandler btHandler = new BTHandler();btHandler.btConnect();现在,但我被告知我应该做一个类,然后在MainActivity中创建一个实例。尝试在另一个类中创建MainActivity中的实例时出现问题

所以这个代码:

BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter(); 
     UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//AA:BB:CC:11:22:33"); 
     try { 
      BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid); 
      socket.connect(); 
      Log.v("connect", "connect"); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
      Log.v("exception","e"); 
     } 
曾经在MainActivity

,但被告知,这应该是由我的大学是谁在帮助我与此另一个类。

MainActivity.java

public class MainActivity extends AppCompatActivity { 
    private BluetoothAdapter mAdapter; 
    Button b1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     b1 = (Button) findViewById(R.id.connect); 
     mAdapter = BluetoothAdapter.getDefaultAdapter(); 
     //init(); 

     if (mAdapter == null) { 
      Toast.makeText(getApplicationContext(), "Device does not Support Bluetooth", Toast.LENGTH_LONG).show(); 
      finish(); 
     } else { 
      if (!mAdapter.isEnabled()) { 
       Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
       startActivityForResult(intent, 1); 
      } 
     } 
    } 

    public void onClick(View v) { 
     int id = v.getId(); 
     switch (id) { 
      case R.id.connect: 
       onConnect(); //Operation 
       Log.v("Log", "Pressed onClick"); 
       break; 
     } 
    } 

    @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).show(); 
      finish(); 
     } 
    } 



    private void onConnect() { 
     ArrayList deviceStrs = new ArrayList(); 
     final ArrayList<String> devices = new ArrayList(); 

     BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter(); 
     Set pairedDevices = mAdapter.getBondedDevices(); 
     if (pairedDevices.size() > 0) { 
      for (Object device : pairedDevices) { 
       BluetoothDevice bdevice = (BluetoothDevice) device; 
       deviceStrs.add(bdevice.getName() + "\n" + bdevice.getAddress()); 
       devices.add(bdevice.getAddress()); 
      } 
     } 

     // show list 
     final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); 

     ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.select_dialog_singlechoice, 
       deviceStrs.toArray(new String[deviceStrs.size()])); 

     alertDialog.setSingleChoiceItems(adapter, -1, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
       int position = ((AlertDialog) dialog).getListView().getCheckedItemPosition(); 
       String deviceAddress = devices.get(position); 

       BTHandler btHandler = new BTHandler(); 
       btHandler.btConnect(); 

      } 
     }); 


     alertDialog.setTitle("Paired devices"); 
     alertDialog.show(); 


    } 
} 

BTHandler.java

public class BTHandler { 
final ArrayList<String> devices = new ArrayList(); 
BluetoothAdapter mAdapter; 
BluetoothDevice device; 
String deviceAddress; 

public BTHandler(Context context, Handler handler) { 
    mAdapter = BluetoothAdapter.getDefaultAdapter(); 
} 

public void btConnect(String deviceAdress) { 
    mAdapter = BluetoothAdapter.getDefaultAdapter(); 
    device = mAdapter.getRemoteDevice(deviceAddress); 

    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//AA:BB:CC:11:22:33"); 
    try { 
     BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(uuid); 
     socket.connect(); 
     Log.v("connect", "connect"); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
     Log.v("exception","e"); 
    } 
} 
} 

logcat的:

Process: com.example.asabanov.powersupplytool, PID: 14113 java.lang.NullPointerException: Attempt to invoke virtual method 'android.bluetooth.BluetoothDevice android.bluetooth.BluetoothAdapter.getRemoteDevice(java.lang.String)' on a null object reference 
at com.example.asabanov.powersupplytool.BTHandler.btConnect(BTHandler.java:19) 
at com.example.asabanov.powersupplytool.MainActivity$1.onClick(MainActivity.java:93) 
at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:1108) 
at android.widget.AdapterView.performItemClick(AdapterView.java:310) 
at android.widget.AbsListView.performItemClick(AbsListView.java:1214) 
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3139) 
at android.widget.AbsListView$3.run(AbsListView.java:3981) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:168) 
at android.app.ActivityThread.main(ActivityThread.java:5845) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 
+0

这里就是您已声明BluetoothAdapter mAdapter的问题;但从来没有初始化它在BTHandler.java –

+0

Aaah陷阱!我编辑了OP,检查我是否做得对。因为我需要一个处理程序。 'BTHandler btHandler = new BTHandler();' 'btHandler.btConnect();'现在BTHandler中的“(Context,Handler)”和BTHandler中的“(String)”无法应用。 – swess

回答

1

您没有采用t他构造函数,其中mAdapter正在初始化,使其成为null所以NullPointerException

变化

BTHandler btHandler = new BTHandler(); 

BTHandler btHandler = new BTHandler(MainActivity.this, null); 

在警告对话框中的onClick方法。

注意:你没有使用第二个参数,所以null不应该担心你或可能你应该删除第二个参数在一起。

更新 这样

BTHandler btHandler = new BTHandler(MainActivity.this, new Handler() { 
    public void handleMessage(Message msg) { 
     String response = msg.getData().getString("message"); 
     // TODO: take your action here 
    } 
}); 

使用这里面发送消息BTHandler创建BTHandler实例。创建一个全局变量mHandler

Message msg = mHandler.obtainMessage(); 
Bundle b = new Bundle(); 
b.putString("message", "Hello"); 
msg.setData(b); 
mHandler.sendMessage(msg); 

更改BTHandler构造这样

Handler mHandler; 
public BTHandler(Context context, Handler handler) { 
    mAdapter = BluetoothAdapter.getDefaultAdapter(); 
    mHandler = handler; 
} 
+0

是的!这工作,谢谢。你有什么想法我也可以有第二个参数工作('btHandler.btConnect();')? – swess

+0

查看我的更新.. – Rohit5k2

+0

对不起,我应该如何使用'BTHandler'内的代码并创建一个全局变量'mHandler'。 – swess

相关问题