尝试通过蓝牙发送文件时,Android Studio应用程序崩溃

时间:2018-09-10 22:49:42

标签: java android android-studio bluetooth

尝试通过蓝牙发送数据时,Android蓝牙应用程序崩溃。我能够开机,发现并显示配对的设备。但是,当我尝试发送文件按钮时,它崩溃了。我在调试器中收到这些错误。

   Process: com.example.bluetooth_demoproject, PID: 31320
              java.lang.NullPointerException: Attempt to get length of null 
                    array
                  at com.example.bluetooth_demoproject.MainActivity.ListDir(MainActivity.java:253)
                  at com.example.bluetooth_demoproject.MainActivity.onPrepareDialog(MainActivity.java:228)
                  at android.app.Activity.onPrepareDialog(Activity.java:4000)
                  at android.app.Activity.showDialog(Activity.java:4063)
                  at android.app.Activity.showDialog(Activity.java:4014)
                  at 

             com.example.bluetooth_demoproject.MainActivity$1.onClick(MainActivity.java:75)
                  at android.view.View.performClick(View.java:6896)
                  at 
        android.widget.TextView.performClick(TextView.java:12689)
                  at android.view.View$PerformClick.run(View.java:26088)
                  at android.os.Handler.handleCallback(Handler.java:789)
                  at android.os.Handler.dispatchMessage(Handler.java:98)
                  at android.os.Looper.loop(Looper.java:164)
                  at 
      android.app.ActivityThread.main(ActivityThread.java:6940)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at 
     com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
                  at 
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

这也是我的MainActivity。如果有更好的方法通过发送文件        蓝牙,请指出或帮助我的代码。

public class MainActivity extends Activity {

// Creating objects -----------------------------
private static final int REQUEST_ENABLE_BT = 0;
private static final int REQUEST_DISCOVER_BT_ = 1;
private static int CUSTOM_DIALOG_ID;
ListView dialog_ListView;
TextView mBluetoothStatus, mPairedDevicesList, mTextFolder;
ImageView mBluetoothIcon;
Button mOnButton, mOffButton, mDiscoverableButton, mPairedDevices, 
    mbuttonOpenDialog, msendBluetooth, mbuttonUp;
File root, fileroot, curFolder;
EditText dataPath;
private static final int DISCOVER_DURATION = 300;
private List<String> fileList = new ArrayList<String>();
    // -------------------------------------------------------
BluetoothAdapter mBlueAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    dataPath =(EditText) findViewById(R.id.FilePath);


    mTextFolder = findViewById(R.id.folder);
    mBluetoothStatus = findViewById(R.id.BluetoothStatus);
    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);
    mPairedDevicesList = findViewById(R.id.pairedDeviceList);
    mbuttonOpenDialog = findViewById(R.id.opendailog);
    msendBluetooth = findViewById(R.id.sendBluetooth);
    mbuttonUp = findViewById(R.id.up);

    mbuttonOpenDialog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dataPath.setText("");
            showDialog(CUSTOM_DIALOG_ID);
        }
    });

    root = new 
         File(Environment.getExternalStorageDirectory().getAbsolutePath());
    curFolder = root;
    msendBluetooth.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            sendViaBluetooth();
        }
    });


    //adapter
    mBlueAdapter = BluetoothAdapter.getDefaultAdapter();

    if(mBlueAdapter == null){
        mBluetoothStatus.setText("Bluetooth is not available");
        return;
    }
    else {
        mBluetoothStatus.setText("Bluetooth is available");
    }
    //if Bluetooth isnt enabled, enable it
    if (!mBlueAdapter.isEnabled()) {
        Intent enableBtIntent = new
                Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
        //set image according to bluetooth Status
    if (mBlueAdapter.isEnabled()) {
        mBluetoothIcon.setImageResource(R.drawable.action_on);
    }
    else {
        mBluetoothIcon.setImageResource(R.drawable.action_off);
    }


    //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("Making device discoverable");
                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
    mPairedDevices.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mBlueAdapter.isEnabled()) {
                mPairedDevices.setText("Paired Devices");
                Set<BluetoothDevice> devices = 
           mBlueAdapter.getBondedDevices();
                 for (BluetoothDevice device : devices){
                    mPairedDevices.append("\nDevice: " + device.getName() + 
      "," + device );

                }
            }
            else {
                //bluetooth is off and cant get paired devices
                showToast("Turn on bluetooth to get paired devices");
            }

        }
    });




  }
      @Override
  protected Dialog onCreateDialog(int id) {
    Dialog dialog = null;
    if (id == CUSTOM_DIALOG_ID) {
        dialog = new Dialog(MainActivity.this);
        dialog.setContentView(R.layout.dailoglayout);
        dialog.setTitle("File Selector");
        dialog.setCancelable(true);
        dialog.setCanceledOnTouchOutside(true);
        mTextFolder = (TextView) dialog.findViewById(R.id.folder);
        mbuttonUp = (Button) dialog.findViewById(R.id.up);
        mbuttonUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ListDir(curFolder.getParentFile());
            }
        });
        dialog_ListView = (ListView) dialog.findViewById(R.id.dialoglist);
        dialog_ListView.setOnItemClickListener(new 
        AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int 
    position, long id) {
                File selected = new File(fileList.get(position));
                if (selected.isDirectory()) {
                    ListDir(selected);
                } else if (selected.isFile()) {
                    getSelectedFile(selected);
                } else {
                    dismissDialog(CUSTOM_DIALOG_ID);
                }
            }
        });

    }
    return dialog;
}


@Override
protected void onPrepareDialog(int id, Dialog dialog) {
    super.onPrepareDialog(id, dialog);
    if (id == CUSTOM_DIALOG_ID) {
        ListDir(curFolder);

    }
}


public void getSelectedFile(File f) {
    dataPath.setText(f.getAbsolutePath());
    fileList.clear();
    dismissDialog(CUSTOM_DIALOG_ID);
}

public void ListDir(File f) {
    if (f.equals(root)) {
        mbuttonUp.setEnabled(false);
    }
    else {
        mbuttonUp.setEnabled(true);
    }
    curFolder = f;
    mTextFolder.setText(f.getAbsolutePath());
    dataPath.setText(f.getAbsolutePath());
    File[] files = f.listFiles();
    fileList.clear();

    for (File file : files) {
        fileList.add(file.getPath());
    }
    ArrayAdapter<String> directoryList = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, fileList);
    dialog_ListView.setAdapter(directoryList);

}

// exits to app --------------------------------
public void exit(View V) {
    mBlueAdapter.disable();
    Toast.makeText(this, "*** Now bluetooth is off...", 
     Toast.LENGTH_LONG).show();
    finish();
}

// send file via bluetooth ------------------------
public void sendViaBluetooth() {
    if(!dataPath.equals(null)) {
        if(mBlueAdapter == null) {
            Toast.makeText(this, "Device doesnt support bluetooth", 
       Toast.LENGTH_LONG).show();
        }
        else {
           enableBluetooth();
        }

    }
    else {
        Toast.makeText(this, "please select a file", 
        Toast.LENGTH_LONG).show();
    }
}


public void enableBluetooth() {
    showToast("Making device discoverable");
    Intent intent = new 
       Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    startActivityForResult(intent, REQUEST_DISCOVER_BT_);
}




  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent 
                   data) {
    if (resultCode == DISCOVER_DURATION && requestCode == 
             REQUEST_DISCOVER_BT_) {
        Intent i = new Intent();
        i.setAction(Intent.ACTION_SEND);
        i.setType("*/*");
        File file = new File(dataPath.getText().toString());

        i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));

        PackageManager pm = getPackageManager();
        List<ResolveInfo> list = pm.queryIntentActivities(i, 0);
        if (list.size() > 0) {
            String packageName = null;
            String className = null;
            boolean found = false;

            for (ResolveInfo info : list) {
                packageName = info.activityInfo.packageName;
                if (packageName.equals("com.android.bluetooth")) {
                    className = info.activityInfo.name;
                    found = true;
                }
            }
            //CHECK BLUETOOTH available or not------------------------------ 
           ------------------
            if (!found) {
                Toast.makeText(this, "Bluetooth not been found", 
   Toast.LENGTH_LONG).show();
            } else {
                i.setClassName(packageName, className);
                startActivity(i);
            }
        }
    } else {
        Toast.makeText(this, "Bluetooth is cancelled", 
        Toast.LENGTH_LONG).show();
    }
}



  @Override
   public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement

    return super.onOptionsItemSelected(item);
}

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

}

0 个答案:

没有答案