Search code examples
androidandroid-intentandroid-contentproviderandroid-bluetoothandroid-sharing

share file over bluetooth opp in Android N


What i am trying is to share a file over bluetooth. I have tried below two methods to pass the file name to the ACTION_SEND intend. share activity is pop'ing up and when i touch the connected bluetooth device, i get a toast saying Bluetooth share: File Unknown file not sent. Both the method fails.

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);
}

Error , Log-

OppService: URI : /storage/emulated/0/images/sample.mp3 OppService: HINT : null OppService: FILENAME: null OppService: MIMETYPE: audio/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);

Error, Log-

OppService: URI : content://com.example.com.test.provider/tester/images/sample.mp3 OppService: HINT : null OppService: FILENAME: null

I have checked the android source code, This error comes when filename is null. Log also says filename is null. But i could not figure out the exact reason. Could someone Please help me out here, what is wrong with my code.


Solution

  • After some study i understood the problem. There were two issues-

    xml tag for external storage(/sdcard/) directory was wrong in xml file.

    I changed as below.

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

    URI permission was not granted

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

    After modifying with above lines of code, File share is working !

    full working 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;
    }
    

    Thanks.