无法在 Android 中发送带有 PDF 文件作为附件的电子邮件

如何解决无法在 Android 中发送带有 PDF 文件作为附件的电子邮件

我在回收站视图中显示我的文件,目标是能够在单击时将它们作为隐式意图通过电子邮件发送,因此用户不必通过从外部存储中拉出它们来手动执行此操作。

但是,当我尝试这样做时,我的应用程序崩溃了,没有错误消息..这是我获取文件路径并尝试发送它的主要活动,专门执行此操作的代码在 sendAsMail 和 OnItemClick 方法

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.linearlayoutmanager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class FileView extends AppCompatActivity {

    private RecyclerView fileRecyclerView;
    private RowAdapter fileAdapter;
    private RecyclerView.LayoutManager fileLayoutManager;
    private ArrayList<RowItem> rowItem;
    private List<File> fileList;
    private final String filePath = "PDF_files";
    private String fileData = "";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file_view);
        File file = new File(getExternalFilesDir(filePath).toString());
        fileList = Arrays.asList(file.listFiles());
        createRows();
        buildrecyclerView();
    }

    public void createRows(){
        rowItem = new ArrayList<>();
        for (int i = 0; i < fileList.size(); i++) {
            rowItem.add(new RowItem(R.drawable.ic_book,(fileList.get(i).getName().replace("__"," ").replace('_','\n').replace('-','/').replace(".pdf",""))));
        }
    }

    public void removeItem(int position) {
        rowItem.remove(position);
        fileAdapter.notifyItemRemoved(position);
    }

    public void reListFiles(){
        File file = new File(getExternalFilesDir(filePath).toString());
        fileList = Arrays.asList(file.listFiles());
    }

    public void sendAsMail(String file) {

        Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
        shareIntent.setType("application/pdf");

        shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Sample Subject"); //set your subject
        shareIntent.putExtra(android.content.Intent.EXTRA_TEXT,"Sample Text"); //set your message

        String filePath = file;
        File filetoShare = new File(filePath);
        Uri uri = Uri.fromFile(filetoShare);
        shareIntent.putExtra(Intent.EXTRA_STREAM,uri);
        startActivity(Intent.createChooser(shareIntent,"Share File"));
    }


    public void buildrecyclerView() {

        fileRecyclerView = findViewById(R.id.recyclerView);
        fileRecyclerView.setHasFixedSize(true);
        fileLayoutManager = new linearlayoutmanager(this);
        fileAdapter = new RowAdapter(rowItem);
        fileRecyclerView.setLayoutManager(fileLayoutManager);
        fileRecyclerView.setAdapter(fileAdapter);

        fileAdapter.setonItemClickListener(new RowAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                fileData = fileList.get(position).toString();
            //    Toast.makeText(FileView.this,"Clicked: " + fileData,Toast.LENGTH_SHORT).show();
                sendAsMail(fileData);
            }

            @Override
            public void onDeleteClick(int position) {
                removeItem(position);

                File deletePath = fileList.get(position);
                deletePath.delete();
                if(deletePath.exists()){
                    getApplicationContext().deleteFile(deletePath.getName());
                }
                reListFiles();
            }

            @Override
            public void onMenuClick(int position) {
            }
        });
    }
}

使用建议的解决方案进行编辑

我的 sendAsMail 方法

   private void sendEmail(File attatchedFile,String name) {

        //File pdfFile = attatchedFile;
        File pdfFile = attatchedFile;
        Log.v("sendEmail STARTED: ","attatched file vaariable saved as File:  " + pdfFile);

        // Write data in your file
        Uri uri = FileProvider.getUriForFile(this,getPackageName(),pdfFile);

        Intent intent = ShareCompat.IntentBuilder.from(this)
                .setStream(uri) // uri from FileProvider
                .getIntent()
                .setAction(Intent.ACTION_VIEW) //Change if needed
                .setDataAndType(uri,"pdf/*")
                .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        startActivity(intent);
    }

调用onclick中的方法

        fileAdapter.setonItemClickListener(new RowAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                String name = fileList.get(position).getName();
                fileData = fileList.get(position);
                //Log.d("LOG: ","fileData: " + fileData + " name: " + name);
                sendEmail(fileData,name);
            }

我传递给 sendEmail 方法的以下变量

文件数据:/storage/emulated/0/Android/data/com.loopbreakr.firstpdf/files/PDF_files/file__name_2021-01-28_16:20:14.pdf

名称:file__name_2021-01-28_16:20:14.pdf

编辑 - 我的登录崩溃

2021-01-28 17:08:11.904 19378-19378/com.loopbreakr.firstpdf V/STARTING METHOD W/:: fileData: /storage/emulated/0/Android/data/com.loopbreakr.firstpdf/files/PDF_files/file__name_2021-01-28_16:20:14.pdf name: file__name_2021-01-28_16:20:14.pdf
2021-01-28 17:08:11.904 19378-19378/com.loopbreakr.firstpdf V/sendEmail STARTED:: attatched file vaariable saved as File:  /storage/emulated/0/Android/data/com.loopbreakr.firstpdf/files/PDF_files/file__name_2021-01-28_16:20:14.pdf
2021-01-28 17:08:11.906 19378-19378/com.loopbreakr.firstpdf D/AndroidRuntime: Shutting down VM
2021-01-28 17:08:11.907 19378-19378/com.loopbreakr.firstpdf E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.loopbreakr.firstpdf,PID: 19378
    java.lang.IllegalArgumentException: Couldn't find Meta-data for provider with authority com.loopbreakr.firstpdf
        at androidx.core.content.FileProvider.parsePathStrategy(FileProvider.java:606)
        at androidx.core.content.FileProvider.getPathStrategy(FileProvider.java:579)
        at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:417)
        at com.loopbreakr.firstpdf.FileView.sendEmail(FileView.java:71)
        at com.loopbreakr.firstpdf.FileView.access$200(FileView.java:25)
        at com.loopbreakr.firstpdf.FileView$1.onItemClick(FileView.java:99)
        at com.loopbreakr.firstpdf.RowAdapter$RowViewHolder.lambda$new$0$RowAdapter$RowViewHolder(RowAdapter.java:51)
        at com.loopbreakr.firstpdf.-$$Lambda$RowAdapter$RowViewHolder$D8MO8iiQsge5Oqk6qgHk3jkm7ew.onClick(UnkNown Source:4)
        at android.view.View.performClick(View.java:7448)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?