2016-03-02 7 views
0

При попытке подключения к устройству приложение (приложение для чтения OBDII) выходит из строя. У меня был класс BTHandler в моей MainActivity, где 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 gotcha! Я редактировал OP, проверяю, правильно ли я сделал это. И так как мне понадобится обработчик. 'BTHandler btHandler = new BTHandler();' 'btHandler.btConnect();' Теперь говорят «(Контекст, Обработчик)» в BTHandler и «(String)» в BTHandler нельзя применить. – swess

ответ

1

Вы не используете т он конструктор, в котором mAdapter инициализируется, заставляя его быть null так NullPointerException

Изменить

BTHandler btHandler = new BTHandler(); 

с

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

в onClick методе диалога оповещения.

Примечание: Вы не используете второй параметр, поэтому null не должен вас беспокоить или может быть, вы должны удалить второй параметр вместе.

Update Создать BTHandler экземпляр как этот

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. Создать глобальную переменную 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' и создавая глобальный var' mHandler' – swess