蓝牙正在我的应用程序中运行。已经不行了。
我收到以下错误。
致命异常:主要 进程: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”为空时,我不采取任何操作。但我的应用程序仍然崩溃。我该怎么办?