【问题标题】:About the android file management, Environment Android notion and android library plugin关于 android 文件管理、Environment Android 概念和 android 库插件
【发布时间】:2017-02-04 11:02:33
【问题描述】:

为了在 Eclipse 下使用 Java 在 Android 中创建文件,我必须使用:

File docsFolder = new File(Environment.getExternalStorageDirectory() + "/toto.txt");

所以,我必须导入import android.os.Environment

案例 1: 在 Eclipse 项目 - Gradle - Refresh All 之后,我收到此错误:

error: package android.os does not exist
import android.os.Environment;
                 ^
C:\Users\pascal\workspaceNeon\JFX_withGluon_10.8n\src\main\java\com\gluonapplication\PopUp.java:2694: error: cannot find symbol
        GluonApplication.traceSimple("Path: " + Environment.getExternalStorageDirectory());
                                                ^
  symbol:   variable Environment

案例 2:

结果:我在 build.gradle 文件中添加了“apply plugin: 'android-library'”(见下文)。

在这种情况下,在 Gradle“全部刷新”上,我得到:

"FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project 'JFX_withGluon_10.8n'.
> **android.compileSdkVersion is missing!**"

看来我的 build.gradle 文件 没问题。我刚刚补充说: “应用插件:'android-library'”。

Java 构建路径库包括 android-25.jar。

src/android/res/AndroidManifest.xml:

 "<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="25"/>

注意:之前在Java源码中,Android系统没有这个文件管理,生成.apk是没有问题的。我还没有处理 gradle。

非常感谢您的帮助。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.javafxports:jfxmobile-plugin:1.3.2'
    }
}

apply plugin: 'org.javafxports.jfxmobile'
apply plugin: 'android-library'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'com.gluonapplication.GluonApplication'

dependencies {
    compile 'com.gluonhq:charm:4.3.0'
    compile files('libs/android-support-v4.jar')
}

jfxmobile {
     downConfig {
        version '3.2.0'
        plugins 'accelerometer', 'compass', 'device', 'orientation', 'storage', 'vibration', 'display', 'magnetometer', 'lifecycle', 'statusbar', 'position'
    }

android {
        applicationPackage = 'com.gluonapplication'
        manifest = 'src/android/AndroidManifest.xml'
        androidSdk = 'C:/Users/pascal/AppData/Local/Android/sdk'
        resDirectory = 'src/android/res'
        compileSdkVersion = '25'
        buildToolsVersion = '25.0.1'


    }

 ios {
         infoPList = file('src/ios/Default-Info.plist')
        forceLinkClasses = [
                'com.gluonhq.**.*',
                'javax.annotations.**.*',
                'javax.inject.**.*',
                'javax.json.**.*',
                'org.glassfish.json.**.*'
        ]
    }
}

【问题讨论】:

  • 您为什么在 2017 年使用 ECLIPSE?不再支持 ECLIPSE!
  • 如果你删除gluon标签,人们会把它当作一个普通的Android问题。使用gluonjavafxports 标签避免混淆。

标签: java android gradle javafx gluon-mobile


【解决方案1】:

您在 downConfig 块下的构建文件中包含了几个“插件”。这些插件是 Charm Down libraries,它提供了一个不可知的 API,这意味着您可以将它们添加到您的主 Java 包中,并且一旦您将应用程序部署到任何可能的平台(桌面、Android 或 iOS)。

如果您想访问给定的文件夹,您可以使用 Storage 插件。

检查 API here

您可以获得私人文件夹(捆绑在您的应用中)或公共文件夹。

对于与您的应用相关的数据,我将使用私人文件夹:

File localRoot = Services.get(StorageService.class)
            .flatMap(s -> s.getPrivateStorage())
            .orElseThrow(() -> new RuntimeException("Error retrieving private storage")); 

所以现在你可以在那里创建你的文件了:

File docsFolder = new File(localRoot + "/toto.txt");

对于一个公共的,首先你需要检查它是否可用(媒体已经挂载并且你有写权限):

boolean storageAvailable = Services.get(StorageService.class)
        .map(service -> service.isExternalStorageWritable())
        .orElse(false);

然后你必须选择你想要获取的文件夹,即Documents

File publicRoot = Services.get(StorageService.class)
        .flatMap(s -> s.getPublicStorage("Documents"))
        .orElseThrow(() -> new RuntimeException("Error retrieving public storage")); 

现在您可以在那里创建文件了:

File docsFolder = new File(publicRoot + "/toto.txt");

最后,如果您检查项目的结构,您会发现每个平台都有一个通用的主包:您只能在其中放置 Java 代码。然后你就有了一个 Android 包,所以如果你需要它,你可以添加 android API,但只能在这个包中。

Charm Down 插件正是如何在主包上创建具有通用 API 的服务的示例(即参见StorageServicehere)及其不同的实现(即参见AndroidStorageServicehere)。

【讨论】:

  • 非常感谢。我更了解如何避免向平台编写专用代码。现在,我正在尝试使用您的第一个解决方案。
  • 我已经实现了您的第一个解决方案并在 Android 上对其进行了测试。这很好用:可以在私有 Android 目录中写入、读取或删除文件
  • 好的。当提供的答案之一适合您时,您应该将其标记为已接受(绿色勾号),因为其他人稍后会发现它并且知道它是有用的。如果您喜欢其中任何一个答案,您也可以投票。这就是 SO 的工作原理......
  • 如何在 SO 讨论中打上“绿勾”?谢谢
【解决方案2】:

要摆脱所有这些复杂问题,我认为您应该尝试使用 Android Studio。

【讨论】:

  • 抱歉,我在这个已经为桌面开发的应用程序中也使用了 javafxports(gluon charm down),没有 Android studio。(注意:这个应用程序对这两个平台是通用的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
相关资源
最近更新 更多