**结案。**此问题不可复制或由打字错误引起。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
12天前关门了。
改进这个问题
我试图使一个蓝牙扫描仪应用程序,但我有问题。应用程序启动时自动关闭。它给了我一个错误:
原因:java.lang.nullpointerexception:尝试在com.example.bluetoothscanner.mainactivity.oncreate(mainactivity)上的空对象引用上调用虚拟方法“android.view.view android.widget.listview.findviewbyid(int)”。java:40)
第40行是我从布局中调用listview的地方,我不知道如何修复它。
mainactivity.java:
package com.example.bluetoothscanner;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
// Declaración de clases
public static final int REQUEST_ACCESS_COARSE_LOCATION = 1;
public static final int REQUEST_ENABLE_BLUETOOTH = 11;
private ListView devicesList;
private Button scanningBtn;
private BluetoothAdapter bluetoothAdapter;
private ArrayAdapter<String> listAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get bluetooth adapter
*devicesList.findViewById(R.id.bluetoothList);*
scanningBtn.findViewById(R.id.button);
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// Se crea un ArrayAdapter para mostrar los resultados en una lista
listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
devicesList.setAdapter(listAdapter);
//Miramos el estado del bluetooth
checkBluetoothState();
scanningBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(bluetoothAdapter != null && bluetoothAdapter.isEnabled())
{
if(checkCoarseLocationPermission())
{
listAdapter.clear();
bluetoothAdapter.startDiscovery();
}
}else
{
checkBluetoothState();
}
}
});
// Se comprueba permisos al empezar la app
checkCoarseLocationPermission();
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(devicesFoundReceiver,new IntentFilter(BluetoothDevice.ACTION_FOUND));
registerReceiver(devicesFoundReceiver,new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED));
registerReceiver(devicesFoundReceiver,new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(devicesFoundReceiver);
}
// Funciones para comprobar los permisos
private boolean checkCoarseLocationPermission(){
if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_ACCESS_COARSE_LOCATION);
return false;
}else{
return true;
}
}
private void checkBluetoothState(){
if (bluetoothAdapter == null){
Toast.makeText(this, "Bluetooth is not available in this device",Toast.LENGTH_SHORT).show();
}else{
if (bluetoothAdapter.isEnabled()){
if(bluetoothAdapter.isDiscovering()){
Toast.makeText(this,"Scanning for bluewtooth devices",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"Bluetooth is enabled",Toast.LENGTH_SHORT).show();
scanningBtn.setEnabled(true);
}
}
else{
Toast.makeText(this,"You need to enable bluetooth",Toast.LENGTH_SHORT).show();
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent,REQUEST_ENABLE_BLUETOOTH);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_ENABLE_BLUETOOTH){
checkBluetoothState();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch(requestCode) {
case REQUEST_ACCESS_COARSE_LOCATION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Access coarse location enabled, you can scan Bluetooth devices", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "Access coare location forbidden, you can not scan Bluetooth devices", Toast.LENGTH_SHORT).show();
}
break;
}
}
// Se implementa el recividor para poder detectar otros dispositivos
private final BroadcastReceiver devicesFoundReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
listAdapter.add(device.getName() + "\n" +device.getAddress());
} else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
scanningBtn.setText("Scanning Bluetooth Devices");
} else if(BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){
scanningBtn.setText("Scanning in progress...");
}
}
};
活动\u main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:enabled="false"
android:text="@string/BtnText"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.837" />
<ListView
android:id="@+id/bluetoothList"
android:layout_width="272dp"
android:layout_height="453dp"
android:layout_marginTop="52dp"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.496"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
2条答案
按热度按时间h6my8fg21#
发生错误的原因是DeviceList对象中没有此类函数调用findviewbyid。为了将listview传递到deviceslist中,必须像这样传递它。
lc8prwob2#
findviewbyid用作
不象