1

I'm trying to implement a sharing function into my app, but it crashes every time it tries to bring up the sharing dialog.

The errors occur in these lines of code

  val builder = AlertDialog.Builder(mContext)
        builder.setTitle(mContext.getString(R.string.dialog_title_options))
        builder.setItems(items) { dialog, item ->
            if (item == 0) {
                shareFileDialog(holder.adapterPosition)
            }
            if (item == 1) {
                renameFileDialog(holder.adapterPosition)
            } else if (item == 2) {
                deleteFileDialog(holder.adapterPosition)
            }
        }

**2nd portion**



 fun shareFileDialog(position: Int) {
        val shareIntent = Intent()
        shareIntent.action = Intent.ACTION_SEND
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(File(getItem(position)?.filePath)))
        shareIntent.type = "audio/mp4"
        mContext.startActivity(
            Intent.createChooser(
                shareIntent,
                mContext.getText(R.string.send_to)
            )
        )
}

Crash log

   android.os.FileUriExposedException: file:///storage/emulated/0/SoundRecorder/3f4f4c.mp4 exposed beyond app through ClipData.Item.getUri()
        at android.os.StrictMode.onFileUriExposed(StrictMode.java:2083)
        at android.net.Uri.checkFileUriExposed(Uri.java:2395)
        at android.content.ClipData.prepareToLeaveProcess(ClipData.java:980)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:11455)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:11461)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:11440)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1714)
        at android.app.Activity.startActivityForResult(Activity.java:5258)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:675)
        at android.app.Activity.startActivityForResult(Activity.java:5203)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:662)
        at android.app.Activity.startActivity(Activity.java:5587)
        at android.app.Activity.startActivity(Activity.java:5555)
        at com.khumomashapa.notes.adapter.FileViewerAdapter.shareFileDialog(FileViewerAdapter.kt:175)
        at com.khumomashapa.notes.adapter.FileViewerAdapter$onBindViewHolder$2$1.onClick(FileViewerAdapter.kt:73)

This is what the log shows me when it crashes. I'm trying to get the app to share or send a file to another device.

Khumo Mashapa
  • 390
  • 1
  • 4
  • 13

1 Answers1

1

If you are targeting Android N (API level 24) or above, you have to either use FileProvider or ask VM to ignore file URI exposure by adding

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());

in Application.onCreate() method.

How to use FileProvider is explained here.

My personal recommendation is to use FileProvider.

Umesh Chauhan
  • 1,460
  • 1
  • 17
  • 26