2016-03-02 1 views
0

L'application (une application de lecture OBDII) se bloque lors de la tentative de connexion à un périphérique. J'ai eu la classe BTHandler dans mon MainActivity où BTHandler btHandler = new BTHandler();btHandler.btConnect(); sont maintenant, mais on m'a dit que je devrais faire une classe et ensuite créer une instance dans MainActivity.Problèmes lors de la tentative de création d'une instance dans MainActivity à partir d'une autre classe

donc ce code:

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"); 
     } 

utilisé pour être en MainActivity, mais on m'a dit qu'il devrait être dans une autre classe par mon collège qui me aide à ce sujet.

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

est le problème que vous avez déclaré BluetoothAdapter mAdapter; mais jamais initialisé dans BTHandler.java –

+0

Aaah gotcha! J'ai édité l'OP, vérifiez pour voir si je l'ai bien fait. Et puisque je vais avoir besoin d'un gestionnaire. 'BTHandler btHandler = new BTHandler();' 'btHandler.btConnect();' Dites maintenant "(Context, Handler)" dans BTHandler et "(String)" dans BTHandler ne peut pas être appliqué. – swess

Répondre

1

Vous n'utilisez pas t il constructeur dans lequel mAdapter est en cours d'initialisation, l'amenant à être null donc un NullPointerException

changement

BTHandler btHandler = new BTHandler(); 

avec

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

dans onClick méthode de dialogue d'alerte.

Remarque: Vous n'utilisez pas de second paramètre, donc null ne devrait pas vous inquiéter ou peut-être vous devriez supprimer le second paramètre tous ensemble.

Mise à jour Créer BTHandler exemple comme celui-ci

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

permet d'envoyer un message à l'intérieur BTHandler. Créer une variable globale mHandler

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

Changer votre constructeur BTHandler comme celui-ci

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

Oui! Cela a fonctionné, merci. Avez-vous une idée de comment je pourrais aussi avoir le deuxième paramètre à travailler ('btHandler.btConnect();')? – swess

+0

Voir ma mise à jour .. – Rohit5k2

+0

Désolé pour mon ignorance, comment dois-je utiliser le code dans 'BTHandler' et créer un var global' mHandler' – swess