如何在android中从在线ics文件中检索事件?

如何在android中从在线ics文件中检索事件?,android,http,icalendar,Android,Http,Icalendar,我目前正在寻找通过http请求访问ics在线文件的解决方案,以便在我的应用程序中使用它。我有个主意,但我不知道怎么做。我想我必须发出一个get请求(可能使用httpURLconnection…)来下载ics文件并保存它,然后在我的活动中使用它。我在我的按钮侦听器中的onClick方法中尝试过这种方法: try { //this is the file you want to download from the remote server String path = "http:/

我目前正在寻找通过http请求访问ics在线文件的解决方案,以便在我的应用程序中使用它。我有个主意,但我不知道怎么做。我想我必须发出一个get请求(可能使用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)
我不明白这个stacktrace

目的是从ics文件中检索事件,以显示您在旅程中的事件。我已经搜索了一个处理ics文件的解决方案,并找到了iCal4j库。但是检索部分是我的问题之一。有人能帮我或给我一些线索吗


PS:如果我的问题有什么问题,请毫不犹豫地向我报告这个问题,我是新来的,除了开始android开发之外

Thx,请您给@anmari提建议。经过一些深入的研究,我找到了问题的解释:连接请求必须放在AsyncTask子级的doInBackground方法中。因此,如果与我处境相同的人需要解决方案,我会将我使用的代码放在下面

AccesHTTP类:

public class AccesHTTP extends AsyncTask<String, String, String> {
    private Controle controle;
    private String urlServ = null;
    public AsyncResponse delegate = null;

    public AccesHTTP(String servaddr) {
        controle = Controle.getInstance(null);
        urlServ = servaddr;
    }

    @Override
    protected String doInBackground(String... strings) {
        // Create a TimeZone
        System.setProperty("net.fortuna.ical4j.timezone.cache.impl", MapTimeZoneCache.class.getName());

        URL url = null;
        try {
            url = new URL(urlServ);
            Reader r = null;
            r = new InputStreamReader(url.openStream(), "ISO-8859-15");
            CalendarBuilder builder = new CalendarBuilder();
            Calendar thisCalendar = builder.build(r);
            controle.refreshEdt(thisCalendar);
        } catch (IOException | ParserException e) {
            e.printStackTrace();
        }

        return "Completed";
    }

    @Override
    protected void onPostExecute(String s){
        Log.d("Return","************ " + s + " ************");
        if(s!=null){
            delegate.processFinish(s);
        };
    }
}

谢谢您的建议@anmari。经过一些深入的研究,我找到了问题的解释:连接请求必须放在AsyncTask子级的doInBackground方法中。因此,如果与我处境相同的人需要解决方案,我会将我使用的代码放在下面

AccesHTTP类:

public class AccesHTTP extends AsyncTask<String, String, String> {
    private Controle controle;
    private String urlServ = null;
    public AsyncResponse delegate = null;

    public AccesHTTP(String servaddr) {
        controle = Controle.getInstance(null);
        urlServ = servaddr;
    }

    @Override
    protected String doInBackground(String... strings) {
        // Create a TimeZone
        System.setProperty("net.fortuna.ical4j.timezone.cache.impl", MapTimeZoneCache.class.getName());

        URL url = null;
        try {
            url = new URL(urlServ);
            Reader r = null;
            r = new InputStreamReader(url.openStream(), "ISO-8859-15");
            CalendarBuilder builder = new CalendarBuilder();
            Calendar thisCalendar = builder.build(r);
            controle.refreshEdt(thisCalendar);
        } catch (IOException | ParserException e) {
            e.printStackTrace();
        }

        return "Completed";
    }

    @Override
    protected void onPostExecute(String s){
        Log.d("Return","************ " + s + " ************");
        if(s!=null){
            delegate.processFinish(s);
        };
    }
}

因为没有其他人对此发表评论,我将插嘴(不是安卓专家)。请注意,获取该文件的原因可能不是它是一个ics文件——它不应该与任何其他get请求有任何不同。因此,请首先关注如何成功获取文件。用谷歌搜索错误信息,看看是否有相关信息。还要确保该文件是公开的。因为没有其他人发表评论,我会插手(不是安卓专家)。请注意,获取该文件的原因可能不是它是一个ics文件——它不应该与任何其他get请求有任何不同。因此,请首先关注如何成功获取文件。用谷歌搜索错误信息,看看是否有相关信息。还要确保该文件是公开的。