我如何编写一个 public 文件供我的服务在 Android 上接收?
How can I write a public file for my service to pick up on Android?
这个问题分为两个部分:1) 满足我需求的最佳解决方案是什么,以及 2) 我该怎么做?
1) 我有一个客户端应用程序,可以将捆绑包发送到服务应用程序。捆绑包可以打破捆绑包大小的限制,所以我需要写出实际请求并在服务端读取它。因此,我无法写入我的私人内部存储。我大量使用这些页面,但运气不佳:http://developer.android.com/guide/topics/data/data-storage.html
http://developer.android.com/training/basics/data-storage/files.html
我目前的理解是,我最好的方法是使用它来获得 public 目录:
File innerDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
然后我添加我的文件名:
String fileName = String.valueOf(request.timestamp + "_avoidRoute"+count+++".ggr");
在完整文件路径中合并这两个结果:
/storage/emulated/0/Download/GroundGuidance/Route/1425579692169_avoidRoute1.ggr
我是这样写入磁盘的:
fos = context.openFileOutput(fullPath, Context.MODE_WORLD_WRITEABLE);
fos.write(routeString.getBytes());
fos.close();
当我尝试将其写入磁盘时出现错误
java.lang.IllegalArgumentException: File /storage/emulated/0/Download/GroundGuidance/Route/1425579692169_avoidRoute1.ggr contains a path separator
当然有——我需要它有路径。我在网上搜索了这个错误的解决方案,告诉我们 FileOutputStream
写一个完整的路径。我做到了,但是虽然我的应用程序没有出错并且似乎在创建文件,但我也无法在 Windows 资源管理器中的 phone 上查看它,这让我相信它正在创建具有私有权限的文件。所以这让我想到 post 和两个问题:
1) 我应该尝试采用不同的方法在我的客户端和服务应用程序之间共享大量数据吗?
2) 如果没有,我错过了什么?
感谢大家的阅读和帮助!
Combing these two results in the full file path:
/storage/emulated/0/Download/GroundGuidance/Route/1425579692169_avoidRoute1.ggr
Which I write to disk like this:
fos = context.openFileOutput(fullPath, Context.MODE_WORLD_WRITEABLE);
这不是对 Context 的 openFileOutput()
方法的正确使用,因为它不采用完整路径,而是应用程序私有存储区域中的文件名。
如果您打算自己开发一条完整的路径,那么请使用
fos = new FileOutputStream(fullPath)
共享权限设置不适用于外部存储,但您需要一个明显的权限来写入(和隐式读取)您的创建者,以及一个用于读取您的消费者的权限。
或者,您可以使用带有文件名和 Context.MODE_WORLD_WRITEABLE 的私有存储(尽管作为建议弃用)并将结果的绝对路径传递给其他应用程序,而不是构建完整路径与 new FileInputStream(path)
.
一起使用
或者您可以使用任何其他数据交换方法 - 内容提供程序、本地套接字等。
这个问题分为两个部分:1) 满足我需求的最佳解决方案是什么,以及 2) 我该怎么做?
1) 我有一个客户端应用程序,可以将捆绑包发送到服务应用程序。捆绑包可以打破捆绑包大小的限制,所以我需要写出实际请求并在服务端读取它。因此,我无法写入我的私人内部存储。我大量使用这些页面,但运气不佳:http://developer.android.com/guide/topics/data/data-storage.html http://developer.android.com/training/basics/data-storage/files.html
我目前的理解是,我最好的方法是使用它来获得 public 目录:
File innerDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
然后我添加我的文件名:
String fileName = String.valueOf(request.timestamp + "_avoidRoute"+count+++".ggr");
在完整文件路径中合并这两个结果:
/storage/emulated/0/Download/GroundGuidance/Route/1425579692169_avoidRoute1.ggr
我是这样写入磁盘的:
fos = context.openFileOutput(fullPath, Context.MODE_WORLD_WRITEABLE);
fos.write(routeString.getBytes());
fos.close();
当我尝试将其写入磁盘时出现错误
java.lang.IllegalArgumentException: File /storage/emulated/0/Download/GroundGuidance/Route/1425579692169_avoidRoute1.ggr contains a path separator
当然有——我需要它有路径。我在网上搜索了这个错误的解决方案,告诉我们 FileOutputStream
写一个完整的路径。我做到了,但是虽然我的应用程序没有出错并且似乎在创建文件,但我也无法在 Windows 资源管理器中的 phone 上查看它,这让我相信它正在创建具有私有权限的文件。所以这让我想到 post 和两个问题:
1) 我应该尝试采用不同的方法在我的客户端和服务应用程序之间共享大量数据吗?
2) 如果没有,我错过了什么?
感谢大家的阅读和帮助!
Combing these two results in the full file path:
/storage/emulated/0/Download/GroundGuidance/Route/1425579692169_avoidRoute1.ggr
Which I write to disk like this:
fos = context.openFileOutput(fullPath, Context.MODE_WORLD_WRITEABLE);
这不是对 Context 的 openFileOutput()
方法的正确使用,因为它不采用完整路径,而是应用程序私有存储区域中的文件名。
如果您打算自己开发一条完整的路径,那么请使用
fos = new FileOutputStream(fullPath)
共享权限设置不适用于外部存储,但您需要一个明显的权限来写入(和隐式读取)您的创建者,以及一个用于读取您的消费者的权限。
或者,您可以使用带有文件名和 Context.MODE_WORLD_WRITEABLE 的私有存储(尽管作为建议弃用)并将结果的绝对路径传递给其他应用程序,而不是构建完整路径与 new FileInputStream(path)
.
或者您可以使用任何其他数据交换方法 - 内容提供程序、本地套接字等。