首页 > 解决方案 > 从 mainActivity 调用方法时出现 java.io.IOException(在类中调用时有效)(android studio)

问题描述

我对编程还很陌生,对于大多数人来说都是自学的,所以请多多包涵。所以我正在和几个朋友一起制作一个应用程序作为一个学校项目,实际上进展非常顺利,但是我有一个问题我似乎无法解决,因为这对我来说没有逻辑意义。

好的,所以我想从 API 调用谷歌日历以加载到应用程序中,当从同一类中的 main 方法调用时,这一切都很好。该方法返回一个包含不同事件的 HashMap。

public static HashMap nextEvent() throws IOException, ParseException {

    String place;
    String startTime;
    String title;
    String day;
    HashMap<Integer, HashMap> info = new HashMap<>();

    //Creates calendar
//    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    final NetHttpTransport HTTP_TRANSPORT = new com.google.api.client.http.javanet.NetHttpTransport();
    Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT)) ---> (line 143)
        .setApplicationName("Hi")
        .build();

    DateTime now = new DateTime(System.currentTimeMillis());
    Events events = service.events().list(calendarId)
        .setMaxResults(10)
        .setTimeMin(now)
        .setOrderBy("startTime")
        .setSingleEvents(true)
        .execute();

    List<Event> items = events.getItems();
    if (items.isEmpty()) {
        return null;
    } else {
        int i = 0;
        for (Event event : items) {

            HashMap<String, String> ev = new HashMap<>();

            //Converts date format from DateTime to hh:mm
            SimpleDateFormat formatter, FORMATTER, FORMATTERDate;
            formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz");
            String oldDate = getTime().toString();
            Date date = formatter.parse(oldDate.substring(0, 26) + oldDate.substring(27, 29));
            FORMATTER = new SimpleDateFormat("hh:mm a");

            //Finds the date
            FORMATTERDate = new SimpleDateFormat("dd/MM");

            startTime = (FORMATTER.format(date));
            day = (FORMATTERDate.format(date));
            place = event.getLocation();
            title = event.getSummary();

            ev.put("Place", place);
            ev.put("Title", title);
            ev.put("Time", startTime);
            ev.put("Day", day);

            info.put(i, ev);
            i++;
        }
        return info;
    }
}

public static void main(String[] args) throws Exception{
    HashMap h = nextEvent();
    for (int i = 0; i < h.size(); i++) {
        System.out.println(h.get(i));
    }
}

它输出

{Title=..., Time=10:30 AM, Day=16/01, Place=Room 365}
{Title=..., Time=10:30 AM, Day=16/01, Place=Room 616}
{Title=..., Time=10:30 AM, Day=16/01, Place=Room 276}
{Title=..., Time=10:30 AM, Day=16/01, Place=Room 359}
{Title=..., Time=10:30 AM, Day=16/01, Place=Rooms 327/329}
{Title=..., Time=10:30 AM, Day=16/01, Place=Room 332a}
{Title=..., Time=10:30 AM, Day=16/01, Place=Room 359}
{Title=..., Time=10:30 AM, Day=16/01, Place=Room 276}
{Title=..., Time=10:30 AM, Day=16/01, Place=Room 366}
{Title=..., Time=10:30 AM, Day=16/01, Place=Room 618}

这很好用,但是当我尝试从MainActivity类中调用方法来设置包含内容的文本字段时,我得到一个IOException. 这对我来说没有意义

当我运行这个

public void setEvent1() throws ParseException, GeneralSecurityException, IOException {
    TextView event1 = findViewById(R.id.event1name);
    TextView event1time = findViewById(R.id.event1time);
    TextView event1place = findViewById(R.id.event1place);

    HashMap<Integer, HashMap> h = nextEvent();

    event1.setText(h.get(0).get("Title").toString());
    event1time.setText(h.get(0).get("Time").toString());
    event1place.setText(h.get(0).get("Place").toString());
}

我收到这个错误

W/System.err: java.io.IOException: unable to create directory: /tokens
W/System.err:     at com.google.api.client.util.store.FileDataStoreFactory.<init>(FileDataStoreFactory.java:61)
                  at com.fisapp.fisapp.CalendarQuickstart.getCredentials(CalendarQuickstart.java:55)
                  at com.fisapp.fisapp.CalendarQuickstart.nextEvent(CalendarQuickstart.java:143)
                  at com.fisapp.fisapp.MainActivity.setEvent1(MainActivity.java:64)
                  at com.fisapp.fisapp.MainActivity.onResume(MainActivity.java:52)
                  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1412)
                  at android.app.Activity.performResume(Activity.java:7292)
                  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3776)
W/System.err:     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3816)
                  at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
                  at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
                  at android.os.Handler.dispatchMessage(Handler.java:106)
                  at android.os.Looper.loop(Looper.java:193)
                  at android.app.ActivityThread.main(ActivityThread.java:6669)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

(这是 getCredentials 方法)

private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
        // Load client secrets.
        InputStream in = CalendarQuickstart.class.getResourceAsStream(CREDENTIALS_JSON);
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,new InputStreamReader(in));

        File file = new File("fisApp/../tokens");

        FileDataStoreFactory dataStoreFactory = new FileDataStoreFactory(file); ----> (This is line 55)
        DataStore<StoredCredential> dataStore = dataStoreFactory.getDataStore("StoredCredential");
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT,JSON_FACTORY, clientSecrets, SCOPES)
                .setCredentialDataStore(dataStore).build();

        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
        return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
    }

我已经尝试了我能想到的一切,但我无法解决这个问题。任何帮助都将成为救命稻草!

提前致谢!

标签: javaandroidandroid-studio

解决方案


推荐阅读