java - 按钮不创建文件并在按下时显示电子邮件提供商选项菜单

标签 java android email

我创建了一个按钮,用于创建文件然后将其作为电子邮件附件发送, 它从其中一个 TextView 中获取文本,将其保存为 .txt 并发送。一个小的电子邮件服务选项选择器也应该出现。该代码旨在创建一个文件路径(如果文件路径不存在)。此代码位于 onCreate 方法之上,并且在常规 Activity 中。 我一直在 logcat 中收到此消息(用 (-->) 标记的特定消息):

-->08-06 12:53:01.019  18432-18432/com.example.adrian.trucktracker W/System.err﹕ java.io.IOException: open failed: ENOENT (No such file or directory)<---
08-06 12:53:01.019  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at java.io.File.createNewFile(File.java:946)
08-06 12:53:01.019  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at com.example.adrian.trucktracker.Locator.clickedUpdate(Locator.java:76)
08-06 12:53:01.019  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
08-06 12:53:01.019  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at android.view.View$1.onClick(View.java:3860)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at android.view.View.performClick(View.java:4480)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at android.view.View$PerformClick.run(View.java:18686)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:733)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:95)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at android.os.Looper.loop(Looper.java:157)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5872)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:668)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at libcore.io.Posix.open(Native Method)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ at java.io.File.createNewFile(File.java:939)
08-06 12:53:01.029  18432-18432/com.example.adrian.trucktracker W/System.err﹕ ... 15 more

我的代码:

    public void clickedUpdate(View view)
        {
            TextView dLong = (TextView) findViewById (R.id.textLong);
            TextView dLat = (TextView) findViewById (R.id.textLat);
            String dataLat = dLat.getText().toString();
            String dataLong = dLong.getText().toString();
            boolean UpdateResume;
            if(!(dataLat.equals("") && !(dataLong.equals(""))))
            {
                UpdateResume = true;
            }
            else
            {
                UpdateResume = false;
            }
            TelephonyManager telephonemanager =(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
            String PhoneNumber = telephonemanager.getLine1Number();
            File DataDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"/LocationData");
            if(!DataDir.exists())
            {
                try
                {
                    DataDir.mkdir();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            File Data = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"data" + File.separator+"Locationer.txt");
            String datapath = Data + ""
            if(!Data.exists())
            {
                try {
line 76 ---->    Data.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                while (UpdateResume = true)
                {
    if (Data.exists())
                    {
                        try
                        {
                            FileWriter fileWriter = new FileWriter(Data);
                            BufferedWriter bfWriter = new BufferedWriter(fileWriter);
                            bfWriter.write(PhoneNumber + "," + dataLat + "," + dataLong);
                            bfWriter.close();
                        }
                        catch (IOException e)
                        {
                            e.printStackTrace();
                        }
                    }
                    break;
                }
            }
            Intent emailintent = new Intent(Intent.ACTION_SEND);
            emailintent.setType("text/plain");
            emailintent.putExtra(Intent.EXTRA_EMAIL, new String[]{"apraiswater@legion-logistics.com"});
            emailintent.putExtra(Intent.EXTRA_SUBJECT, "Data");
            emailintent.putExtra(Intent.EXTRA_TEXT, "Hello World!");
            File root = Environment.getExternalStorageDirectory();
            String DataAttachment = "Android/data/Locationer.txt";
            File filer = new File(root, DataAttachment);
            if (!filer.exists() || filer.canRead())
            {
                return;
            }
            Uri uri = Uri.fromFile(filer);
            emailintent.putExtra(Intent.EXTRA_STREAM, uri);
            startActivity(Intent.createChooser(emailintent, "Choose an Email provider"));
    }

最佳答案

一些细节似乎相关:

首先检查目录是否存在:

        File DataDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"/LocationData");
        if(!DataDir.exists())
        {
            try
            {
                DataDir.mkdir();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }

根据documentation ,不需要您的 try{}catch(Exception e){}。您只需要检查该目录是否确实存在。还有一个问题是您似乎创建了另一个子目录的子目录。所以,你可能想把它换成mkdirs()相反。

然后,如果文件不存在,则尝试创建文件

   try {
line 76 ---->    Data.createNewFile();
   } catch (IOException e) {
           e.printStackTrace();
   }

查看 this method 的文档.您可能会注意到它告诉您

This method is not generally useful. For creating temporary files, use createTempFile(String, String) instead. For reading/writing files, use FileInputStream, FileOutputStream, or RandomAccessFile, all of which can create files.

但也许,如果您包含了适当的权限,我上面建议的更改将有助于使您的代码正常工作。

关于java - 按钮不创建文件并在按下时显示电子邮件提供商选项菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25165695/

相关文章:

java - catch block 的语法错误,在一台计算机上有效,但在另一台计算机上无效?

java - hibernate 中查询参数为 null 或为空时如何处理?

android - 如何将 WearableActivity 与 LiveData 和 ViewModel 一起使用

android - 将图像从 ImageView 保存到内部/外部设备存储器中

android - Android listview 中的自定义 Adapter 有很多 if

java - 在 ADT 中添加参数

Java,OpenCV VideoWriter isOpened 总是返回 false

php - 在用 PHP 发送邮件时,不需要的符号(如 = 和 3D)出现在收件人的一端

azure - 如何为 www.domainname.com 设置 Azure DNS 区域而不影响 mail.domainname.com

iphone - 带动画的电子邮件图片