0

Что я пытаюсь передать файл через Bluetooth. Я попытался использовать два метода, чтобы передать имя файла в ACTION_SEND. share активность всплывает, и когда я касаюсь подключенного устройства Bluetooth, я получаю тост, говорящий Bluetooth share: File Unknown file not sent. Оба метода терпят неудачу.Поделиться файлом по bluetooth opp в Android N

public void pushFileOverOpp(String filename) { 
    Intent intent = new Intent(); 
    intent.setAction(Intent.ACTION_SEND); 
    intent.setPackage("com.android.bluetooth"); 
    intent.setType("audio/mp3"); 
    File f = new File(Environment.getExternalStorageDirectory(), "images"); 
    File sample = new File(f, "sample.mp3"); 
    Uri u = Uri.parse(sample.toString()); 
    intent.putExtra(Intent.EXTRA_STREAM, u); 
    mContext.startActivity(intent); 
} 

Ошибка, Log-

OppService: URI: /storage/emulated/0/images/sample.mp3 OppService: ПОДСКАЗКА: нулевой OppService: FILENAME: нулевой OppService: MIMETYPE: аудио/mp3

File f = new File(mContext.getFilesDir(), "images"); 
File sample = new File(f, "sample.mp3"); 
Uri u = FileProvider.getUriForFile(mContext, 
      BuildConfig.APPLICATION_ID + ".provider", sample); 
intent.putExtra(Intent.EXTRA_STREAM, u); 

Ошибка, Log-

OppService: URI: Содержание: //com.example.com.test.provider/tester/images/sample.mp3 OppService: ПОДСКАЗКА: нулевой OppService: FILENAME: нулевой

Я проверил исходный код Android, Эта ошибка возникает, когда имя файла равно null. Log также говорит, что имя файла равно null. Но я не мог точно определить причину. Может кто-то, пожалуйста, помогите мне здесь, что не так с моим кодом.

ответ

0

После некоторого изучения я понял проблему. Было два вопроса:

xml tag для внешнего хранилища (/ sdcard /) был неправильным в файле xml.

Я изменил, как показано ниже.

<root-path 
    name="root" 
    path="/" /> 

URI разрешение не было предоставлено

mContext.grantUriPermission("com.android.bluetooth", u, 
      Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

После изменения с выше строк кода, доля файла работает!

полный рабочий code-

public boolean pushFileOverOpp(String filename) { 
    Intent intent = new Intent(); 
    intent.setAction(Intent.ACTION_SEND); 
    intent.setType("*/*"); // supports all mime types 
    intent.setPackage("com.android.bluetooth"); //bluetooth package name, default opp 

    File folder = new File(Environment.getExternalStorageDirectory(), "images"); 
    File file = new File(folder, filename); 
    if (!file.exists()) { 
     Logger.e("No such file " + filename + " exists!"); 
     return false; 
    } 
    Uri u = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".provider", file); 
    intent.putExtra(Intent.EXTRA_STREAM, u); 

    mContext.grantUriPermission("com.android.bluetooth", u, 
      Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

    Logger.d("Sharing file over bluetooth " + folder.toString()); 
    mContext.startActivity(intent); 
    return true; 
} 

Спасибо.

0

См. Этот код, он работает и обменивается файлами с помощью метода createChooser.

  ArrayList<Uri> arrayList2 = new ArrayList<>(); 

      String MEDIA_PATH = new String(Environment.getExternalStorageDirectory() + 
        "/NewCallLogs/audio.mp3"); 

      File files = new File(MEDIA_PATH); 
      Uri u = Uri.fromFile(files); 
      arrayList2.add(u); 

      Intent share = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE); 
      share.setData(Uri.parse("mailto:")); 
      share.setType("audio/mpeg"); 
      share.putExtra(android.content.Intent.EXTRA_STREAM, arrayList2); 
      try { 
       startActivity(Intent.createChooser(share, "Share...")); 
       // getActivity().finish(); 
       Log.i("Finished sharing.", ""); 
      } catch (android.content.ActivityNotFoundException ex) { 
       Toast.makeText(getActivity(), "nothing shared.", Toast.LENGTH_SHORT).show(); 
      } 

Для обмена файл только в блютуз

ArrayList<Uri> arrayList2 = new ArrayList<>(); 

      String MEDIA_PATH = new String(Environment.getExternalStorageDirectory() + 
        "/NewCallLogs/audio.mp3"); 

      File files = new File(MEDIA_PATH); 
      Uri u = Uri.fromFile(files); 
      arrayList2.add(u); 

      Intent share = new Intent(android.content.Intent.ACTION_SEND); 
      share.setData(Uri.parse("mailto:")); 
      share.setType("audio/mpeg"); 
      share.setPackage("com.android.bluetooth"); 
      share.putExtra(android.content.Intent.EXTRA_STREAM, arrayList2); 
      startActivity(share); 
+0

Если у вас есть сомнения, обратитесь с запросом. –

+0

Спасибо, Но это не будет работать на SDK версии 24 или выше. Вот почему я поставил Android N в вопрос. Две проблемы с вышеуказанным кодом - 'java.lang.ClassCastException: java.util.ArrayList нельзя отбрасывать на android.os.Parcelable' - передать parcellable isntead arraylist. Next 'Caused by: android.os.FileUriExposedException:' - мы не можем использовать 'Uri.fromFile'. :( – Rilwan