Android-приложение Bluetooth не запускается из-за ошибки нулевого указателя - PullRequest
0 голосов
/ 09 сентября 2018

Приложение Bluetooth не будет работать из-за исключений нулевого указателя. Нет ошибок, но я не вижу, чтобы подключиться к эмулятору, так как приложение просто каждый раз падает. Даже если я попробую примеры кодов GitHub, он тоже не запустится. Я выложу код и catlog и все остальное, что вам нужно. Спасибо за вашу помощь

package com.example.bluetooth_demoproject;

import android.app.Activity;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;

import java.util.Set;

public class MainActivity extends Activity {


private static final int REQUEST_ENABLE_BT = 0;
private static final int REQUEST_DISCOVER_BT_ = 1;

TextView mBluetoothStatus, mPairedDevicelist;
ImageView mBluetoothIcon;
Button mOnButton, mOffButton, mDiscoverableButton, mPairedDevices, 
mSendImage;

BluetoothAdapter mBlueAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
    mBluetoothStatus = findViewById(R.id.BluetoothStatus);
    mPairedDevicelist = findViewById(R.id.pairedDeviceList);
    mBluetoothIcon = findViewById(R.id.bluetoothIcon);
    mOnButton = findViewById(R.id.onButton);
    mOffButton = findViewById(R.id.offButton);
    mDiscoverableButton = findViewById(R.id.discoverableButton);
    mPairedDevices = findViewById(R.id.pairedDevices);
    mSendImage = findViewById(R.id.sendImage);


    //adapter
   BluetoothAdapter mBluetoothAdapter = 
  BluetoothAdapter.getDefaultAdapter();

    // check if bluetooth is available
    if(mBluetoothAdapter == null){
        mBluetoothStatus.setText("Bluetooth is not available");
    }
    else {
        mBluetoothStatus.setText("Bluetooth is available");
        }
        //if Bluetooth isnt enabled, enable it
    if (!mBluetoothAdapter.isEnabled()) {
       Intent enableBtIntent = new 
   Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }


    //on button Click
    mOnButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            if (!mBlueAdapter.isEnabled()) {
                showToast("Turning Bluetooth on...");
                // intent to on bluetooth
                Intent intent = new 
  Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(intent, REQUEST_ENABLE_BT);

            }
            else {
                showToast("Bluetooth is already on");
            }

        }
    });

    //discover Bluetooth button
    mDiscoverableButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            if (!mBlueAdapter.isDiscovering()) {
                showToast("Discovering devices..");
                Intent intent = new 
       Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                startActivityForResult(intent, REQUEST_DISCOVER_BT_);
            }

        }

    });

    // off button click
    mOffButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mBlueAdapter.isEnabled()) {
                showToast("Turning Bluetooth off...");
                // intent to turn off bluetooth
                mBluetoothIcon.setImageResource(R.drawable.action_off);
            }
            else{
                showToast("Bluetooth is already off");
            }

        }
    });



    //get paired device button click


    Set<BluetoothDevice> pairedDevices = 
    mBluetoothAdapter.getBondedDevices();
       if (pairedDevices.size() > 0) {
           // Retrieve the name and address of the paired devices
           for (BluetoothDevice device: pairedDevices) {
               String deviceName = device.getName();
               String deviceAddr = device.getAddress();
           }
       }





}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent 
     data) {
     switch (requestCode) {
        case REQUEST_ENABLE_BT:
            if (resultCode == RESULT_OK){
                //bluetooth is on
                mBluetoothIcon.setImageResource(R.drawable.action_on);
                showToast("Bluetooth is on");
            }
            else {
                //user is denied turning on Bluetooth
                showToast("Unable to turn on Bluetooth");
            }
            break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

//toast message function
private void showToast(String msg) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT) .show();
}

   }



    9-08 22:03:46.371 1510-2830/system_process W/ActivityManager: 
  getRunningAppProcesses: caller 10060 does not hold REAL_GET_TASKS; 
    limiting output

09-08 22: 03: 46.372 5869-5869 /? I / InstantRun: запуск сервера мгновенного запуска: это основной процесс 09-08 22: 03: 46.416 5869-5869 /? E / BluetoothAdapter: связыватель Bluetooth является нулевым 09-08 22: 03: 46.416 5869-5869 /? D / AndroidRuntime: выключение виртуальной машины 09-08 22: 03: 46.418 5869-5869 /? E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: главная Процесс: com.example.bluetooth_demoproject, PID: 5869 java.lang.RuntimeException: Невозможно запустить действие ComponentInfo {com.example.bluetooth_demoproject / com.example.bluetooth_demoproject.MainActivity}: java.lang.NullPointerException: попытка вызвать виртуальный метод «логический android.bluetooth.BluetoothAdabled.dap». на нулевой ссылке на объект на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2325) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2387) на android.app.ActivityThread.access $ 800 (ActivityThread.java:151) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1303) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:135) на android.app.ActivityThread.main (ActivityThread.java:5254) в java.lang.reflect.Method.invoke (родной метод) в java.lang.reflect.Method.invoke (Method.java:372) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:903) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:698) Вызывается: java.lang.NullPointerException: попытка вызвать виртуальный метод 'boolean android.bluetooth.BluetoothAdapter.isEnabled ()' для ссылки на пустой объект в com.example.bluetooth_demoproject.MainActivity.onCreate (MainActivity.java:57) на android.app.Activity.performCreate (Activity.java:5990) на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1106) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2278) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2387) на android.app.ActivityThread.access $ 800 (ActivityThread.java:151) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1303) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:135) на android.app.ActivityThread.main (ActivityThread.java:5254) в java.lang.reflect.Method.invoke (родной метод) в java.lang.reflect.Method.invoke (Method.java:372) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:903) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:698) 09-08 22: 03: 46.431 1510-2232 / system_process W / ActivityManager: Принудительное завершение операции 1 com.example.bluetooth_demoproject / .MainActivity enter code here

1 Ответ

0 голосов
/ 09 сентября 2018

Похоже, проблема в строке 59: if (!mBluetoothAdapter.isEnabled()) {

Примечание. В сообщении об ошибке указана строка 57, а в моем текстовом редакторе - 59.

Несколько строк выше, вы проверяете, был ли объект mBluetoothAdapter успешно создан, проверяя, является ли он == null. Но после этого вы вызываете его метод: .isEnabled(). Я думаю, проблема в том, что mBluetoothAdapter становится null и, следовательно, выдает исключение NullPointerException при попытке доступа к одному из его методов.

Если я правильно понимаю, я думаю, что решение будет примерно таким:

// check if bluetooth is available
if(mBluetoothAdapter == null){
    mBluetoothStatus.setText("Bluetooth is not available");
}
else {
    mBluetoothStatus.setText("Bluetooth is available");
    //if Bluetooth isnt enabled, enable it
    if (!mBluetoothAdapter.isEnabled()) {
        Intent enableBtIntent = new 
            Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
}

Это позволит сохранить код активации от mBluetoothAdapter со значением null.

В качестве альтернативы, вы можете использовать return для выхода из метода, если BlueTooth недоступен.

// check if bluetooth is available
if(mBluetoothAdapter == null){
    mBluetoothStatus.setText("Bluetooth is not available");
    return;
}
else {
    mBluetoothStatus.setText("Bluetooth is available");
    }
    //if Bluetooth isnt enabled, enable it
if (!mBluetoothAdapter.isEnabled()) {
   Intent enableBtIntent = new 
       Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
   startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

Это сделало бы то же самое немного чище.

Я думаю, что следующий шаг для вас - выяснить, почему BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); возвращает null вместо нужного вам объекта. Я не думаю, что ответ на этот вопрос в вашем MainActivity методе. Устройство не находит адаптер по умолчанию, и это может быть результатом многочисленных проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...