存储Gmail可访问Android应用程序日志的最佳实践

存储Gmail可访问Android应用程序日志的最佳实践,android,Android,我想要什么 我想为我的应用程序存储一个日志,这样当我收到错误报告时,日志就会附加到电子邮件中 问题 根据Android文档,您不一定希望用户看到或其他应用程序访问的文件需要存储在内部存储器中。然而,有些应用程序我想访问它,如Gmail和其他电子邮件应用程序,当用户给我发电子邮件时,我会报告错误,但我不一定希望用户一直都能免费访问它 可能的解决办法 我只是咬紧牙关,从一开始就将日志存储在外部存储器上,并允许用户访问它们。但是,当没有外部存储可用时,这会导致问题 我将日志存储在内部存储器中,如果有空

我想要什么

我想为我的应用程序存储一个日志,这样当我收到错误报告时,日志就会附加到电子邮件中

问题

根据Android文档,您不一定希望用户看到或其他应用程序访问的文件需要存储在内部存储器中。然而,有些应用程序我想访问它,如Gmail和其他电子邮件应用程序,当用户给我发电子邮件时,我会报告错误,但我不一定希望用户一直都能免费访问它

可能的解决办法

  • 我只是咬紧牙关,从一开始就将日志存储在外部存储器上,并允许用户访问它们。但是,当没有外部存储可用时,这会导致问题
  • 我将日志存储在内部存储器中,如果有空间,该存储器总是可用的,每次提交错误报告时,我都会将日志复制到外部存储器中。然而,这违背了私人概念
  • 我的问题

    我如何在内部存储一个或多个文件,同时允许它们成为Gmail等应用程序的附件

    保存到外部存储解决方案是一个好主意还是一个愚蠢的主意


    非常感谢您的帮助。

    将记录的信息保密给您的应用程序。还考虑从日志文件中过滤出敏感信息(即不记录用户名、密码、……)。下一步,在你的应用程序中建立一个“报告错误”选项,在这里你可以访问这些信息

    无需公开此信息。

    也验证替代方案,并考虑如果你真的需要把这类工作解决这个问题。知道默认android bug报告有这样一个选项,开发人员控制台有很多关于所发生崩溃的信息

    找到了答案

    您可以使用Android文件提供程序

    将其添加到应用程序标记中的
    manifest.xml

             <provider 
                 android:name="android.support.v4.content.FileProvider"
                 android:authorities="insert_application_package_name_plus_identifier"
                 android:exported="false"
                 android:grantUriPermissions="true"
                 android:readPermission="insert_application_package_name_plus_identifier.READ">
                 <meta-data
                     android:name="android.support.FILE_PROVIDER_PATHS"
                     android:resource="@xml/provider_paths"/>
             </provider>
    
    然后,当涉及到将它们附加到电子邮件时

        emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
    
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,new String[] {insert_email_address_here});
    
        ArrayList<Uri> uris = new ArrayList<Uri>();
        File directory = getFilesDir();
        File[] list = directory.listFiles();
        for (File f : list) {
            if (f.getName().contains("log") && f.getName().contains(".txt"))
                uris.add(FileProvider.getUriForFile(this, "insert_application_package_name_plus_identifier",f));
        }
    
       emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    
    
        emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        emailIntent.setType("message/rfc822");
        startActivity(Intent.createChooser(emailIntent, "Choose preferred email client."));
    
    emailIntent=newintent(android.content.Intent.ACTION\u SEND\u MULTIPLE);
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,新字符串[]{insert_EMAIL_address_here});
    ArrayList URI=新的ArrayList();
    File directory=getFilesDir();
    File[]list=directory.listFiles();
    用于(文件f:列表){
    如果(f.getName()包含(“日志”)和&f.getName()包含(“.txt”))
    add(FileProvider.getUriForFile(这是“插入应用程序\包\名称\加\标识符”,f));
    }
    emailIntent.putParcelableArrayListExtra(Intent.EXTRA\u流,URI);
    emailIntent.addFlags(Intent.FLAG\授予\读取\ URI\权限);
    emailIntent.setType(“message/rfc822”);
    startActivity(Intent.createChooser(emailIntent,“选择首选电子邮件客户端”);
    

    我希望这对某人有所帮助。

    感谢您提供了有关critercism的链接。我没听说过。在理想情况下,我肯定会将其部署到应用程序中,但这是一个成本问题。对于敏感信息,我不会将其存储在日志文件中。我非常乐意将其放置在内部存储中,但是否存在将其连接到外部应用程序的问题?
        emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
    
        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,new String[] {insert_email_address_here});
    
        ArrayList<Uri> uris = new ArrayList<Uri>();
        File directory = getFilesDir();
        File[] list = directory.listFiles();
        for (File f : list) {
            if (f.getName().contains("log") && f.getName().contains(".txt"))
                uris.add(FileProvider.getUriForFile(this, "insert_application_package_name_plus_identifier",f));
        }
    
       emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    
    
        emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        emailIntent.setType("message/rfc822");
        startActivity(Intent.createChooser(emailIntent, "Choose preferred email client."));