Android Studio 蓝牙连接权限错误

问题描述 投票:0回答:0

蓝牙正在我的应用程序中运行。已经不行了。

我收到以下错误。

致命异常:主要 进程:bluedut.dutlab.app,PID:32482 java.lang.RuntimeException:无法启动活动 ComponentInfo{bluedut.dutlab.app/com.example.bluetoothkontrolc.baglan}:java.lang.NullPointerException:尝试调用虚拟方法“java.util.Set android.bluetooth.BluetoothAdapter”。空对象引用上的 getBondedDevices()' 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loopOnce(Looper.java:201) 在 android.os.Looper.loop(Looper.java:288) 在 android.app.ActivityThread.main(ActivityThread.java:7839) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 引起原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.util.Set android.bluetooth.BluetoothAdapter.getBondedDevices()” 在 com.example.bluetoothkontrolc.baglan.cihazlarıGöster(baglan.java:157) 在 com.example.bluetoothkontrolc.baglan.checkBluetoothPermissions(baglan.java:135) 在 com.example.bluetoothkontrolc.baglan.onCreate(baglan.java:62) 在 android.app.Activity.performCreate(Activity.java:8051) 在 android.app.Activity.performCreate(Activity.java:8031) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loopOnce(Looper.java:201) 在 android.os.Looper.loop(Looper.java:288) 在 android.app.ActivityThread.main(ActivityThread.java:7839) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

我认为该错误是由蓝牙权限引起的。

我想要以下权限。

 <uses-permission android:name="android.permission.BLUETOOTH"/>
 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
 <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>

我的java代码的活动页面是这样的:

包 com.example.bluetoothkontrolc;

import android.Manifest;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Set;
import java.util.UUID;

public class baglan extends AppCompatActivity {
    ImageButton G;

    private static final int REQUEST_ENABLE_BT = 1;
    private static final int REQUEST_BLUETOOTH_PERMISSIONS = 1;
    static BluetoothSocket btSocket = null; //veri iletimi
    private boolean isBtConnected = false;
    static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

    public static boolean baglantiDurumu = false; //bağlantıyı kontrol etmek için değişken


    //nesneleri ekle
    ListView cihazlar; //listelenecek bluetoothlar tanımlıyoruz
    BluetoothAdapter b_t; //cihazın bluetoothunu tanımlıyoruz

    String ADRESS = null;
    private ProgressDialog progress;
    BluetoothAdapter myBluetooth = null;

    BluetoothDevice remoteDevice;
    BluetoothServerSocket myServer;

    private Set<BluetoothDevice> btCihazları;

    public static String E_ADRES = "cihaz_adresi"; //adresleri kaydedeceğimiz değişken
    ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        checkBluetoothPermissions();
        if(secenekler.dil == 1){
            // TODO Auto-generated method stub
            Locale locale = new Locale("tr"); //locale i default locale yani türkçe yaptık. Artık değişkenler values paketinden alınacak
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config,
                    getBaseContext().getResources().getDisplayMetrics());
            // finish();//mevcut acivity i bitir.
            //startActivity(getIntent());//activity i baştan yükle

        }
        else if(secenekler.dil == 2){
            // TODO Auto-generated method stub
            Locale locale = new Locale(""); //locale i default locale yani türkçe yaptık. Artık değişkenler values paketinden alınacak
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            getBaseContext().getResources().updateConfiguration(config,
                    getBaseContext().getResources().getDisplayMetrics());
            // finish();//mevcut acivity i bitir.
            //startActivity(getIntent());//activity i baştan yükle
        }

        setContentView(R.layout.activity_baglan);

        G = findViewById(R.id.G_id); //buton nesnesini ekledik
        G.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View View) { //butona tıklandığında
                Intent gec = new Intent(baglan.this, AnaSayfa.class); //sayfa yönlendirmesi yapıyor
                startActivity(gec);
            }

        });


//sayfanın kodu direk çalışıyor eylem gerektirmiyor.
        b_t = BluetoothAdapter.getDefaultAdapter(); //cihazın bt'sini açacak nesneyi ekliyoruz
        cihazlar = findViewById(R.id.LV_id); //cihazları listelenecek nesneyi ekliyoruz

        if (b_t == null) { //eğer hiç bt bulamazsa mesaj gönderiyoruz.
            if (secenekler.dil == 1) {
                Toast.makeText(getApplicationContext(), "Bluetooth cihazı bulunamadı", Toast.LENGTH_SHORT).show();
            }
            else if(secenekler.dil == 2){
                Toast.makeText(getApplicationContext(), "Bluetooth device not found", Toast.LENGTH_SHORT).show();
            }
        }
        if (!b_t.isEnabled()) { //cihazın bt'u açık değilse;
            Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); //cihazın bt açıyoruz
            startActivity(enableBTIntent);
            cihazlarıGöster(); //döngüye gidiyor
        }
        if (b_t.isEnabled()) { //cihazın bt açıksa
            cihazlarıGöster(); //döngüye gidiyor
        }
    }

    private void checkBluetoothPermissions() {
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {
            // Cihazın Bluetooth özelliği yok, uygun bir hata mesajı gösterebilir veya işlemleri durdurabilirsiniz.

        }

        if (!bluetoothAdapter.isEnabled()) {
            // Bluetooth kapalı, kullanıcıyı açmaları için yönlendirebilirsiniz.

        } else {
            // Bluetooth açık, cihazları gösterebilirsiniz.
            cihazlarıGöster();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == REQUEST_BLUETOOTH_PERMISSIONS) {
            // Bluetooth izinleri için sonuçları kontrol et
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED &&
                    grantResults[1] == PackageManager.PERMISSION_GRANTED) {

                // Eğer izinler verildiyse Bluetooth cihazlarını göster
                cihazlarıGöster();
            } else {
                // Eğer izinler verilmediyse kullanıcıya bilgi verilebilir veya işleme devam edilebilir
                // (Bluetooth özelliğini kullanamazlar, ancak başka işlemler yapılabilir).
            }
        }
    }


    private void cihazlarıGöster() { //cihazların listelendiği döngü
        btCihazları = b_t.getBondedDevices(); //cihazları değişkene kaydediyor
        ArrayList list = new ArrayList(); //liste oluşturuyor

        if (btCihazları.size() > 0) { //eğer cihaz bulduysa;
            for (BluetoothDevice bt : btCihazları) { // cihazları listeye atıyor
                list.add(bt.getName() + "\n" + bt.getAddress()); //cihazların adını ve adreslerini gösteriyor
            }
        }
        final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list); //listeleme yapıyor
        cihazlar.setAdapter(adapter);
        cihazlar.setOnItemClickListener(CihazSec); //cihaz seçme döngüsüne gidiyoruz
    }

    public AdapterView.OnItemClickListener CihazSec = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //listelenen cihazları tıklanma şeysi yapıyor

            String bilgi = ((TextView) view).getText().toString(); //cihaz adı
            ADRESS = bilgi.substring(bilgi.length() - 17); //uzunluğundan 17 çıkıyor

            /*
            Intent gecis = new Intent(baglan.this, baglantimenu.class); //bağlantı sayfamıza yönendiriliyoruz
            gecis.putExtra(E_ADRES, adresss); //adres değişkenimizi başka değişkene kaydediyoruz, bu değişkeni başka sayfalarda kullanacağız
            startActivity(gecis);
            */
            new BTbaglan().execute(); //gerekli

        }
    };

    private class BTbaglan extends AsyncTask<Void, Void, Void> {
        private boolean ConnectSuccess = true;

        @Override   //bağlanma işlemi
        protected void onPreExecute() {
            if (secenekler.dil == 1) {
                progress = ProgressDialog.show(baglan.this, "Bağlanıyor...", "Lütfen bekleyin");
            }
            else if(secenekler.dil == 2){
                progress = ProgressDialog.show(baglan.this, "Connecting...", "Please waiting");
            }
        }

        // https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android-301/asynctask
        @Override   //sürekli bağlantı
        protected Void doInBackground(Void... devices) {
            try {

                if (btSocket == null || !isBtConnected) {
                    myBluetooth = BluetoothAdapter.getDefaultAdapter();
                    BluetoothDevice cihaz = myBluetooth.getRemoteDevice(ADRESS);
                    btSocket = cihaz.createInsecureRfcommSocketToServiceRecord(myUUID);
                    BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
                    btSocket.connect();
                    finish();//mevcut acivity i bitir.
                    startActivity(getIntent());//activity i baştan yükle
                }

            } catch (IOException e) {
                ConnectSuccess = false;

            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result); //bağlanmadı
            if (!ConnectSuccess) {
                // msg("Baglantı Hatası, Lütfen Tekrar Deneyin");

                if (secenekler.dil == 1) {
                    Toast.makeText(getApplicationContext(), "Bağlantı hatası tekrar deneyin", Toast.LENGTH_SHORT).show();

                }
                else if(secenekler.dil == 2){
                    Toast.makeText(getApplicationContext(), "Connection error, retry", Toast.LENGTH_SHORT).show();

                }
                baglantiDurumu = false; //bağlantı yok
                finish();
            } else {
                //   msg("Baglantı Basarılı"); //bağlandı
                if (secenekler.dil == 1) {
                    Toast.makeText(getApplicationContext(), "Bağlantı başarılı", Toast.LENGTH_SHORT).show();
                }
                else if(secenekler.dil == 2){
                    Toast.makeText(getApplicationContext(), "Connection succeeded", Toast.LENGTH_SHORT).show();
                }

                isBtConnected = true; //bağlandı ise

                baglantiDurumu = true;  //bağlantı var

                Intent intent2 = new Intent(baglan.this, AnaSayfa.class); //sayfa yönlendirmesi yapıyor
                startActivity(intent2);
            }
            progress.dismiss();
        }
    }
}

当“bluetoothAdapter”为空时,我不采取任何操作。但我的应用程序仍然崩溃。我该怎么办?

java android-studio permissions android-bluetooth
© www.soinside.com 2019 - 2024. All rights reserved.