当前位置: 首页 > 知识库问答 >
问题:

Android.os.FileuriExposedException:通过intent.getData()异常在应用程序之外公开,同时共享VCFile

谭毅然
2023-03-14

问题陈述

我正在尝试创建VCardfile,它已经成功创建,但是,我想共享创建的文件

            var vdfdirectory = File(
                Environment.getExternalStorageDirectory().toString() + VCF_DIRECTORY
            );
            // have the object build the directory structure, if needed.
            if (!vdfdirectory.exists()) {
                vdfdirectory.mkdirs();
            }

            vcfFile =
                File(vdfdirectory, "android_" + Calendar.getInstance().getTimeInMillis() + ".vcf");

            val fw: FileWriter = FileWriter(vcfFile);
            fw.write("BEGIN:VCARD\r\n");
            fw.write("VERSION:3.0\r\n");
            // fw.write("N:" + p.getSurname() + ";" + p.getFirstName() + "\r\n");
            fw.write("FN:" + "Sibtain" + "\r\n");
            //  fw.write("ORG:" + p.getCompanyName() + "\r\n");
            //  fw.write("TITLE:" + p.getTitle() + "\r\n");
            fw.write("TEL;TYPE=WORK,VOICE:" + "+923155022905" + "\r\n");
            //   fw.write("TEL;TYPE=HOME,VOICE:" + p.getHomePhone() + "\r\n");
            //   fw.write("ADR;TYPE=WORK:;;" + p.getStreet() + ";" + p.getCity() + ";" + p.getState() + ";" + p.getPostcode() + ";" + p.getCountry() + "\r\n");
            fw.write("EMAIL;TYPE=PREF,INTERNET:" + "abc@gmail.com" + "\r\n");
            fw.write("END:VCARD\r\n");
            fw.close();


            val txtIntent = Intent(Intent.ACTION_SEND)
            txtIntent.setDataAndType(Uri.fromFile(vcfFile), "text/x-vcard");
            startActivity(Intent.createChooser(txtIntent, "Share"))
            Toast.makeText(this, "Created!", Toast.LENGTH_SHORT).show();
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths> 
<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.testapp.provider"
            android:exported="false"
            android:grantUriPermissions="true"
            tools:replace="android:authorities">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"
                tools:replace="android:resource" />
        </provider> 

共有1个答案

曹驰
2023-03-14

尝试下面的代码,它用于共享VCFile:

 private void shareContact(ContactsModal modal) {

    String lookupKey = null;
    Cursor cur = ((Activity)context).getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, new String[]
            { ContactsContract.Contacts.LOOKUP_KEY },
            ContactsContract.Contacts._ID + " = " + modal.getContactID(), null, null);

    if (cur.moveToFirst()) {
         lookupKey = cur.getString(0);
    }
    if(lookupKey!=null){
        Uri vcardUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType(ContactsContract.Contacts.CONTENT_VCARD_TYPE);
        intent.putExtra(Intent.EXTRA_STREAM, vcardUri);
        intent.putExtra(Intent.EXTRA_SUBJECT, "Contact Name");
        ((Activity)context).startActivity(intent);
    }
}
 类似资料:
  • 在以Android API<24为目标的Delphi早期版本(10.3 Rio之前)中,可以创建文件意图,如使用Delphi使用外部图库打开图像的问题答案所示 但是,既然10.3的目标是Android API>=24,那么这段代码就会产生这个问题的主题。 我试图在Delphi使用android fileprovider向默认的android gallery发送打开和图像文件的意图来回答这个问题,但

  • 所以我希望有人能帮我解决这个问题:) 谢谢

  • 我已经从服务器下载了apk文件,现在正在安装,但它给了我一个错误:通过Intent暴露在应用程序之外。getData() 我的代码是 我已经搜索了错误,找到了一些但无法解决的问题。建议使用FileProvider。我这样做只是为了查看日志 可能会有帮助。 请提供帮助和建议。

  • 我正在使用FB。允许用户使用此代码共享我的页面的ui: 当从 Android 移动应用程序中的嵌入式浏览器共享页面时,用户可以选择要用于打开共享对话框的应用程序。如果选择了脸书应用,则不会有回调响应。在普通的桌面浏览器中,一切都按预期工作。这种行为是预期的吗?

  • 问题内容: 我在Linux 2.6中。我有一个环境,其中2个进程通过消息传递模式的简单实现来模拟(使用共享内存)数据交换。 我有一个客户端进程(从父进程(即服务器)派生),该进程将struct(消息)写入使用以下命令创建的内存映射区域(在派生之后): 然后将此指针以链接列表的形式写入到另一个共享内存区域中的队列中,该共享内存区域对于服务器和客户端进程是通用的(因为如果在派生之前使用上面的相同代码创

  • 问题内容: 我一次运行2个单独的Java应用程序。(两个单独的javaw.exe)在它们运行时,我需要在它们之间共享一个对象。 没有永久存储的最简单方法是什么? 问题答案: 对象及其实例变量可以在Java程序的线程之间共享,这是非常简单的任务。 如果您需要在两个程序之间共享对象(例如它的对象)而没有数据存储,那么下一个选择将是使用RMI套接字通信或Java消息传递服务。