在 Android 上的何处创建可公开访问的日志文件
Where to create a publicly-accessible log file on Android
我们的应用程序包含大量 C++ 代码,这些代码将自己的日志文件创建为一个简单的 .txt 文件。它是一个循环缓冲区,所以它的大小限制在我们指定的范围内。它也被放置在我们指定的任何目录中。
问题是将文件放在哪里以便可以使用 ADB 或类似工具(无需生根)访问它。如果我们不关心可公开访问的部分,那么这似乎是找到文件的合理位置:
packageManager.getApplicationInfo(applicationContext.getPackageName().dataDir
但由于我们希望能够从客户的 phone 中提取文件以进行 post-mortem 调试,我尝试将其放在此处:
"/mnt/sdcard/Android/data"
由于多种原因,这是有问题的,但我不确定它们是否都是真的。 (1) 硬编码; (2) 并非所有 Android 设备都有外部存储,尽管我认为它们仍将其映射到内部存储? (3) 该位置不是特定于应用程序的,因此不会随应用程序一起卸载。并且 (4) 需要 EXTERNAL_STORAGE 的运行时权限。
我相信 1-3 可以用类似的方法解决:
android.content.Context.getExternalFilesDir()
或者有更好的选择吗?
但我认为这不会绕过 #4,这很不幸,因为我不希望 "scare" 用户提出更多权限请求。
处理此问题的最佳方法是什么?
确保您有权使用清单文件中的以下代码读取和写入外部 SD:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
然后这个字符串会给你想要的路径:
String directory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + getContext().getPackageName();
/storage/emulated/0/Android/data/com.exemple.yourapp/
我们的应用程序包含大量 C++ 代码,这些代码将自己的日志文件创建为一个简单的 .txt 文件。它是一个循环缓冲区,所以它的大小限制在我们指定的范围内。它也被放置在我们指定的任何目录中。
问题是将文件放在哪里以便可以使用 ADB 或类似工具(无需生根)访问它。如果我们不关心可公开访问的部分,那么这似乎是找到文件的合理位置:
packageManager.getApplicationInfo(applicationContext.getPackageName().dataDir
但由于我们希望能够从客户的 phone 中提取文件以进行 post-mortem 调试,我尝试将其放在此处:
"/mnt/sdcard/Android/data"
由于多种原因,这是有问题的,但我不确定它们是否都是真的。 (1) 硬编码; (2) 并非所有 Android 设备都有外部存储,尽管我认为它们仍将其映射到内部存储? (3) 该位置不是特定于应用程序的,因此不会随应用程序一起卸载。并且 (4) 需要 EXTERNAL_STORAGE 的运行时权限。
我相信 1-3 可以用类似的方法解决:
android.content.Context.getExternalFilesDir()
或者有更好的选择吗?
但我认为这不会绕过 #4,这很不幸,因为我不希望 "scare" 用户提出更多权限请求。
处理此问题的最佳方法是什么?
确保您有权使用清单文件中的以下代码读取和写入外部 SD:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
然后这个字符串会给你想要的路径:
String directory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + getContext().getPackageName();
/storage/emulated/0/Android/data/com.exemple.yourapp/