(不是同样的问题)
我想在片段上做蓝牙设备列表。我的第一个活动标志活动,如果用户按下,则添加了蓝牙设备列表的按钮
应打开设备列表页面上的按钮(无符号)。但是如果我在mBroadcastreceiver3函数中添加了replace: path=/usr/pgsql-9.6/data/postgresql.conf regexp='#listen_addresses(\s)*=\'locahost'\' replace='listen_addresses = *' remote_src=yes backup=yes
,请按照我的代码进行操作。
我有很多LOGCAT(在我的问题下方)。每当我删除此行时,我都不会看到任何logcat,但是我的应用程序中没有看到我的设备列表。 (但是我可以在log.d看到设备)
我怎么解决这个问题。请帮我谢谢。
(对不起,我的英语)。
LOGCAT:
lvData.setAdapter(mDeviceListAdapter);
可能我的问题在这里:
07-03 09:12:25.514 18406-18406/com.example.duygu.mybluetoothdevicelist E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.duygu.mybluetoothdevicelist, PID: 18406
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.device.action.FOUND flg=0x10 (has extras) } in com.example.duygu.mybluetoothdevicelist.BluetoothListFragment$2@a7d633b
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:935)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
at com.example.duygu.mybluetoothdevicelist.BluetoothListFragment$2.onReceive(BluetoothListFragment.java:98)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:925)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
MainActivitiy.java
private BroadcastReceiver mBroadcastReceiver3;
{
mBroadcastReceiver3 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
Log.d(TAG, "onReceive: ACTION FOUND.");
// mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (action.equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
mBTDevices.add(device);
Log.d(TAG, "onReceive: " + device.getName() + ": " + device.getAddress());
mDeviceListAdapter = new DeviceListAdapter(getActivity().getApplicationContext(),R.layout.fragment_bluetooth_list, mBTDevices);
lvData.setAdapter(mDeviceListAdapter);
}
}
};
}
BluetoothFragment.java
public class MainActivity extends AppCompatActivity {
private static final String TAG =" " ;
BluetoothAdapter mBluetoothAdapter;
int test=0;
FragmentManager fm;
FragmentTransaction ft;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
//bluetooth= (Button)findViewById(R.id.bluetooth);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
if(test==0) {
StartFirstFragment();
}
fab.setOnClickListener(new View.OnClickListener() {
public static final String TAG = " ";
@Override
public void onClick(View view) {
//Open bluetooth and show device list at the new fragment
BluetoothListFragment devicelist = new BluetoothListFragment();
FragmentManager manager = getFragmentManager();
manager.beginTransaction().replace(R.id.mainLayout, devicelist).commit();
test=1;
}
});
}
private void StartFirstFragment() {
SignFragment signfragment =new SignFragment();
FragmentManager fm =getFragmentManager();
fm.beginTransaction().replace(R.id.mainLayout,signfragment).commit();
}
}
DeviceListADapter.java
public class BluetoothListFragment extends Fragment implements AdapterView.OnItemClickListener {
public static final String TAG =" " ;
ArrayList<String> data;
//BluetoothDevice mBTDevices;
BluetoothConnectionService mBluetoothConnection;
BluetoothAdapter mBluetoothAdapter;
ListView lvData;
Button discover;
public ArrayList<BluetoothDevice> mBTDevices = new ArrayList<>();
public DeviceListAdapter mDeviceListAdapter;
private static final UUID MY_UUID_INSECURE =
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_bluetooth_list, container, false);
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),android.R.layout.simple_expandable_list_item_1,data);
if (adapter==null){
Log.d(TAG, "adapter null");
}
ListView lvData =(ListView) v.findViewById(R.id.lvData);
discover =(Button) v.findViewById(R.id.discover);
lvData.setAdapter(mDeviceListAdapter);
lvData.setOnItemClickListener(BluetoothListFragment.this);
mBluetoothConnection = new BluetoothConnectionService(getActivity());
enableDisableBT();
btnEnableDisable_Discoverable();
discover.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
discover_devices();
}
});
return v;
}
private BroadcastReceiver mBroadcastReceiver3;
{
mBroadcastReceiver3 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
Log.d(TAG, "onReceive: ACTION FOUND.");
// mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (action.equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
mBTDevices.add(device);
Log.d(TAG, "onReceive: " + device.getName() + ": " + device.getAddress());
mDeviceListAdapter = new DeviceListAdapter(getActivity().getApplicationContext(),R.layout.fragment_bluetooth_list, mBTDevices);
lvData.setAdapter(mDeviceListAdapter);
}
}
};
}
private void enableDisableBT() {
if(mBluetoothAdapter == null){
Log.d(TAG, "enableDisableBT: Does not have BT capabilities.");
}
if(!mBluetoothAdapter.isEnabled()){
Log.d(TAG, "enableDisableBT: enabling BT.");
Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(enableBTIntent);
IntentFilter BTIntent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
getActivity().registerReceiver(mBroadcastReceiver1, BTIntent);
}
if(mBluetoothAdapter.isEnabled()){
Log.d(TAG, "enableDisableBT: disabling BT.");
mBluetoothAdapter.disable();
IntentFilter BTIntent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
getActivity().registerReceiver(mBroadcastReceiver1, BTIntent);
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void btnEnableDisable_Discoverable() {
Log.d(TAG, "btnEnableDisable_Discoverable: Making device discoverable for 300 seconds.");
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
IntentFilter intentFilter = new IntentFilter(mBluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
getActivity().registerReceiver(mBroadcastReceiver2,intentFilter);
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy: called.");
super.onDestroy();
getActivity().unregisterReceiver(mBroadcastReceiver1);
getActivity().unregisterReceiver(mBroadcastReceiver2);
getActivity().unregisterReceiver(mBroadcastReceiver3);
}
@RequiresApi(api = Build.VERSION_CODES.M)
private final BroadcastReceiver mBroadcastReceiver2 = new BroadcastReceiver() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED)) {
int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.ERROR);
switch (mode) {
//Device is in Discoverable Mode
case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
Log.d(TAG, "mBroadcastReceiver2: Discoverability Enabled.");
break;
//Device not in discoverable mode
case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
Log.d(TAG, "mBroadcastReceiver2: Discoverability Disabled. Able to receive connections.");
break;
case BluetoothAdapter.SCAN_MODE_NONE:
Log.d(TAG, "mBroadcastReceiver2: Discoverability Disabled. Not able to receive connections.");
break;
case BluetoothAdapter.STATE_CONNECTING:
Log.d(TAG, "mBroadcastReceiver2: Connecting....");
break;
case BluetoothAdapter.STATE_CONNECTED:
Log.d(TAG, "mBroadcastReceiver2: Connected.");
break;
}
}
}
};
private final BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// When discovery finds a device
if (action.equals(mBluetoothAdapter.ACTION_STATE_CHANGED)) {
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, mBluetoothAdapter.ERROR);
switch(state){
case BluetoothAdapter.STATE_OFF:
Log.d(TAG, "onReceive: STATE OFF");
break;
case BluetoothAdapter.STATE_TURNING_OFF:
Log.d(TAG, "mBroadcastReceiver1: STATE TURNING OFF");
break;
case BluetoothAdapter.STATE_ON:
Log.d(TAG, "mBroadcastReceiver1: STATE ON");
break;
case BluetoothAdapter.STATE_TURNING_ON:
Log.d(TAG, "mBroadcastReceiver1: STATE TURNING ON");
break;
}
}
}
};
@RequiresApi(api = Build.VERSION_CODES.M)
public void discover_devices(){
Log.d(TAG, "btnDiscover: Looking for unpaired devices.");
if(mBluetoothAdapter.isDiscovering()){
mBluetoothAdapter.cancelDiscovery();
Log.d(TAG, "btnDiscover: Canceling discovery.");
//check BT permissions in manifest
checkBTPermissions();
mBluetoothAdapter.startDiscovery();
IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND);
getActivity().registerReceiver(mBroadcastReceiver3, discoverDevicesIntent);
}
if(!mBluetoothAdapter.isDiscovering()){
//check BT permissions in manifest
checkBTPermissions();
mBluetoothAdapter.startDiscovery();
IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND);
getActivity().registerReceiver(mBroadcastReceiver3, discoverDevicesIntent);
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void checkBTPermissions() {
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){
int permissionCheck =getActivity().checkSelfPermission("Manifest.permission.ACCESS_FINE_LOCATION");
permissionCheck += getActivity().checkSelfPermission("Manifest.permission.ACCESS_COARSE_LOCATION");
if (permissionCheck != 0) {
this.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); //Any number
}
}else{
Log.d(TAG, "checkBTPermissions: No need to check permissions. SDK version < LOLLIPOP.");
}
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
//first cancel discovery because its very memory intensive.
mBluetoothAdapter.cancelDiscovery();
Log.d(TAG, "onItemClick: You Clicked on a device.");
String deviceName = mBTDevices.get(i).getName();
String deviceAddress = mBTDevices.get(i).getAddress();
Log.d(TAG, "onItemClick: deviceName = " + deviceName);
Log.d(TAG, "onItemClick: deviceAddress = " + deviceAddress);
//create the bond.
//NOTE: Requires API 17+? I think this is JellyBean
/* if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
Log.d(TAG, "Trying to pair with " + deviceName);
mBTDevices.get(i).createBond();
mBTDevice = mBTDevices.get(i);
mBluetoothConnection = new BluetoothConnectionService(callbackinterface.this);
}*/
}
}