Ресурсы доступа к процессору аннотаций Android (активы)

Я хочу получить доступ к ресурсу из моего проекта студии Android в моем процессоре аннотаций.

Сначала я попытался использовать метод getResource из файла:

FileObject fo = processingEnv.getFiler().getResource(StandardLocation.SOURCE_PATH, "", "src/main/res/layout/activity_main.xml");

, но он всегда выдавал исключение, которое просто возвращало "src/main/res/layout/activity_main.xml" в виде сообщения.

Следующая мысль, которую я пробовал, была

this.getClass().getResource("src/main/res/layout/activity_main.xml")

, но это всегда возвращало значение null.

Последнее, что я пытался использовать, было следующим:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null);
            Iterable<? extends File> locations = fm.getLocation(StandardLocation.SOURCE_PATH);
            for (File file : locations) {
                System.out.print(file.getAbsolutePath());
            }

, но выдает исключение нулевого указателя


person H3x0n    schedule 14.05.2016    source источник
comment
Любая ссылка на термин ресурс в инструментах, которые работают для обычной Java (в дополнение к Android), будет относиться к ресурсам Java/JAR, а не к ресурсам Android.   -  person CommonsWare    schedule 14.05.2016
comment
я нашел решение   -  person H3x0n    schedule 14.05.2016


Ответы (2)


Я использовал следующее, чтобы получить папку макета из моего процессора аннотаций:

private File findLayouts() throws Exception {
        Filer filer = processingEnv.getFiler();

        JavaFileObject dummySourceFile = filer.createSourceFile("dummy" + System.currentTimeMillis());
        String dummySourceFilePath = dummySourceFile.toUri().toString();

        if (dummySourceFilePath.startsWith("file:")) {
            if (!dummySourceFilePath.startsWith("file://")) {
                dummySourceFilePath = "file://" + dummySourceFilePath.substring("file:".length());
            }
        } else {
            dummySourceFilePath = "file://" + dummySourceFilePath;
        }

        URI cleanURI = new URI(dummySourceFilePath);

        File dummyFile = new File(cleanURI);

        File projectRoot = dummyFile.getParentFile().getParentFile().getParentFile().getParentFile().getParentFile().getParentFile();

        return new File(projectRoot.getAbsolutePath() + "/src/main/res/layout");
    }
person H3x0n    schedule 14.05.2016
comment
Я знаю, что это против правил, чтобы поблагодарить вас в комментариях, но я не могу удержаться! СПАСИБО! - person Andranik; 29.04.2020

Экземпляр процессора запускается на корневом уровне проекта, поэтому вы можете сделать это простым способом:

String fileSeparator = System.getProperty("file.separator");
    String absoluteFilePth = "app" + fileSeparator + "src" + fileSeparator + "main" + fileSeparator + "res" + fileSeparator + "layout";
    File file = new File(absoluteFilePth);

С уважением,

person Yamil Marques de Mello    schedule 29.03.2019