【发布时间】:2020-09-25 22:01:58
【问题描述】:
我目前正在寻找一种通过 http 请求访问 ics 在线文件的解决方案,以便在我的应用程序中使用它。我有一个想法,但我不知道该怎么做。我想我必须发出一个获取请求(可能使用 httpURLconnection ...)来下载 ics 文件并保存它,然后在我的活动中使用它。我在按钮监听器的 onClick 方法中尝试过这种方式:
try {
//this is the file you want to download from the remote server
String path = "http://.../file.ics";
//this is the name of the local file you will create
boolean eof = false;
URL u = new URL(path);
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
FileOutputStream f = new FileOutputStream(new File("data/edt.ics"));
InputStream in = c.getInputStream();
byte[] buffer = new byte[1024];
int len1 = 0;
while ((len1 = in.read(buffer)) > 0) {
f.write(buffer, 0, len1);
}
f.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但它会在 logcat 中创建此错误:
06-02 15:29:05.260 6685-6685/com.enib.enibapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.enib.enibapp, PID: 6685
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188)
at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:114)
at com.enib.enibapp.ui.home.HomeFragment$1.onClick(HomeFragment.java:74)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
而且我不明白这个堆栈跟踪...
目的是从 ics 文件中检索事件以显示您在旅程中的事件。我已经搜索了处理 ics 文件的解决方案,并且找到了 iCal4j 库。但检索部分是我的问题之一。有人可以帮助我或给我线索吗?
PS:如果我的问题有问题,请不要犹豫,向我报告问题,我是新人除了开始android开发
【问题讨论】:
-
由于没有其他人发表评论,我会加入(不是安卓专家)。 WRT 获取文件,它是 ics 文件的事实可能不是原因 - 它与任何其他获取请求没有任何不同。所以先关注如何成功获取文件。谷歌错误消息,看看是否有任何关系。还要确保该文件是公开的。