簡體   English   中英

Android的藍牙。 空指針

[英]Android-Bluetooth. Null pointer

我是目標編程的初學者,但我不知道該怎么做。 我在openBT方法中使用空指針時遇到一些錯誤。 下面是我的logcat和代碼。

MainActivity.java:

public class MainActivity extends ActionBarActivity implements DrawingViewInterface {

private DrawingView drawView;
private ImageButton currPaint;


BluetoothAdapter mBluetoothAdapter;        
BluetoothSocket mmSocket;                  
BluetoothDevice mmDevice;                  
OutputStream mmOutputStream;               
InputStream mmInputStream;                 
Thread workerThread;
byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);    

    drawView = (DrawingView)findViewById(R.id.drawing);    

    drawView.setViewListener(this);   



}



public void findBT(View view){          

    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

    if(mBluetoothAdapter==null){                            
        Toast.makeText(getApplicationContext(),"Nie wykryto BT", Toast.LENGTH_LONG).show();
    }

    if(!mBluetoothAdapter.isEnabled()){                          
            Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBluetooth,0);
     }

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    if(pairedDevices.size() > 0)
    {
        for(BluetoothDevice device : pairedDevices)
        {
            if(device.getName().equals("MattsBlueTooth"))
            {
                mmDevice = device;
                break;
            }
        }
    }

    Toast.makeText(getApplicationContext(),"Znaleziono BT", Toast.LENGTH_LONG).show();

}



public void openBT(View view) throws IOException
{
    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); 
    mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
    mmSocket.connect();
    mmOutputStream = mmSocket.getOutputStream();
    mmInputStream = mmSocket.getInputStream();


    Toast.makeText(getApplicationContext(),"Bluetooth jest otwarty", Toast.LENGTH_LONG).show();

    sendData();                     


}

void sendData() throws IOException
{
    String msg = "chuj";
    msg += "\n";
    mmOutputStream.write(msg.getBytes());
    Toast.makeText(getApplicationContext(),"Dane zostały przesłane", Toast.LENGTH_LONG).show();
}


}

logcat的:

    03-31 01:00:13.795  18767-18767/com.example.aplikacja3 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.aplikacja3, PID: 18767
    java.lang.IllegalStateException: Could not execute method of the activity
            com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)

            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)

            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.bluetooth.BluetoothSocket android.bluetooth.BluetoothDevice.createRfcommSocketToServiceRecord(java.util.UUID)' on a null object reference
            at com.example.aplikacja3.MainActivity.openBT(MainActivity.java:157)
            at java.lang.reflect.Method.invoke(Native Method)
            
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
03-31 01:35:21.665  20598-20598/com.example.aplikacja3 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.aplikacja3, PID: 20598
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:4012)

            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)

            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.bluetooth.BluetoothSocket android.bluetooth.BluetoothDevice.createRfcommSocketToServiceRecord(java.util.UUID)' on a null object reference
            at com.example.aplikacja3.MainActivity.openBT(MainActivity.java:157)
            at java.lang.reflect.Method.invoke(Native Method)
            
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

有人可以幫忙嗎?

編輯:

謝謝! 你幫我。 但是我的問題不同。 我忘記了在“ FindBT”中更改設備的名稱。 EHH ..

但是現在我還有其他問題。 我嘗試與計算機連接,但是當我嘗試發送內容時,我得到了以下信息:

java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:4012)
            at android.view.View.performClick(View.java:4761)
            at android.view.View$PerformClick.run(View.java:19767)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4007)
            at android.view.View.performClick(View.java:4761)
            at android.view.View$PerformClick.run(View.java:19767)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.io.IOException: read failed, socket might closed or timeout, read ret: -1
            at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:517)
            at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:528)
            at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:320)
            at com.example.aplikacja3.MainActivity.openBT(MainActivity.java:160)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4007)
            at android.view.View.performClick(View.java:4761)
            at android.view.View$PerformClick.run(View.java:19767)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

與您的logcat一致,您正在從一個空對象createRfcommSocketToServiceRecord調用方法createRfcommSocketToServiceRecord。 該解決方案僅在mmDevice之后具有非空值的情況下才調用openBT。 為避免崩潰,您可以將此if條件作為openBT方法的第一行:

if (mmDevice != null) {
    // rest of your method here

只要您的BT設備沒有將其自身標識為MattsBlueTooth ,您就必須在findBT方法中修改設備名稱或完全刪除條件:

if(device.getName().equals("MattsBlueTooth"))
{
    mmDevice = device;
    break;
}

不過,如果相關的藍牙設備未配對,則應應用@androidevil建議的檢查以避免崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM