Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google Drive Android API-Access应用程序跨设备创建的文件和文件夹_Android_Google Drive Api_Google Drive Android Api - Fatal编程技术网

Google Drive Android API-Access应用程序跨设备创建的文件和文件夹

Google Drive Android API-Access应用程序跨设备创建的文件和文件夹,android,google-drive-api,google-drive-android-api,Android,Google Drive Api,Google Drive Android Api,按照我的理解,使用新的,为了访问文件夹及其内容,你必须拥有文件夹的——因为这确保了应用程序只能访问它自己创建的内容 现在,我的应用程序将文件上传到用户的Google Drive帐户自定义文件夹中的图片。第一次创建此文件夹时,我将文件夹的驱动器ID保存到共享首选项,以便以后可以访问该文件夹进行更多上载。我的问题是,我希望用户能够从多个设备访问图片,以便他/她(例如)在平板电脑上观看从他/她的手机上传的图片,反之亦然,但如果两台设备上都没有文件夹的驱动器ID,我就无法做到这一点。我能想到的唯一解决方

按照我的理解,使用新的,为了访问文件夹及其内容,你必须拥有文件夹的——因为这确保了应用程序只能访问它自己创建的内容

现在,我的应用程序将文件上传到用户的Google Drive帐户自定义文件夹中的图片。第一次创建此文件夹时,我将文件夹的驱动器ID保存到共享首选项,以便以后可以访问该文件夹进行更多上载。我的问题是,我希望用户能够从多个设备访问图片,以便他/她(例如)在平板电脑上观看从他/她的手机上传的图片,反之亦然,但如果两台设备上都没有文件夹的驱动器ID,我就无法做到这一点。我能想到的唯一解决方案是通过云服务在用户设备之间共享DriveId,但这似乎非常不方便


有什么想法吗?

你不一定要有DriveId,这是最可靠的方法,因为它唯一地标识文件夹。您还可以根据标题进行查询,以尝试查找相同的文件夹。假设web和Android应用程序共享一个应用程序id,那么两者应该能够访问相同的文件


在应用程序之间共享状态的一个简单选项是使用新启动的应用程序文件夹,称为web上的应用程序数据文件夹。这是一个隐藏文件夹,您可以在其中存储特定于应用程序的文件。它还没有出现在Android文档中,但应该在Google Play Services 4.3发布后立即出现。请参见

您不必拥有DriveId,这是最可靠的方法,因为它唯一地标识文件夹。您还可以根据标题进行查询,以尝试查找相同的文件夹。假设web和Android应用程序共享一个应用程序id,那么两者应该能够访问相同的文件


在应用程序之间共享状态的一个简单选项是使用新启动的应用程序文件夹,称为web上的应用程序数据文件夹。这是一个隐藏文件夹,您可以在其中存储特定于应用程序的文件。它还没有出现在Android文档中,但应该在Google Play Services 4.3发布后立即出现。请看

无耻地把自己提升为谢丽尔的伙伴,我可以给你一些具体的观点,因为我以前也经历过这个挑战。这就是我所做的:

在系统根目录-MyStupidAppRoot'中为我的应用程序创建唯一的“根目录”。在这里,您将遇到主要的挑战,因为您是按名称创建它的,如果您基于它的不存在创建它,您可能无法可靠地检查它。但情况正在好转,请参见和。 一旦你有了一个可靠的锚“MyStupidAppRoot”,你就可以创建Cheryl提到的AppFolder,但现在还不可用,或者再次创建你自己的可见文件,这是一个独特的创建挑战,可以保存你想要的任何东西。例如,像您的所有首选项字符串。我甚至有勇气在那里存储完整的SQLite DB文件。这是可能的,因为您将字节[]缓冲区写入文件。 然后,使用你的应用程序的任何其他设备都可以找到“MyStupidAppRoot”,从那里获取资源文件并读取它。 需要注意的是,您自己的文件夹/文件与AppFolder之间的主要区别在于,用户无法读取AppFolder的内容,但仍然可以删除它

下面是如何将byte[]缓冲区写入文件。它是“wait”版本以使其简单化,但有一个异步版本“createFileAsync”

关于身份证:


上面提到的DriveId是一个对象,可以转换为2个不同的字符串,如中所述。选择哪一个取决于你自己。“encodeToString”中较长的一个更容易通过“decodeFromString”转换回DriveId,较短的一个可以在http地址中很容易识别,但使用async/await方法获取DriveId-fetchDriveId。

无耻地将自己提升为Cheryl的助手,我可以给你一些具体的观点,因为我以前经历过这个挑战。这就是我所做的:

在系统根目录-MyStupidAppRoot'中为我的应用程序创建唯一的“根目录”。在这里,您将遇到主要的挑战,因为您是按名称创建它的,如果您基于它的不存在创建它,您可能无法可靠地检查它。但情况正在好转,请参见和。 一旦你有了一个可靠的锚“MyStupidAppRoot”,你就可以创建Cheryl提到的AppFolder,但现在还不可用,或者再次创建你自己的可见文件,这是一个独特的创建挑战,可以保存你想要的任何东西。例如,像您的所有首选项字符串。我甚至有勇气在那里存储完整的SQLite DB文件。这是可能的,因为您将字节[]缓冲区写入文件。 然后,使用你的应用程序的任何其他设备都可以找到“MyStupidAppRoot”,从那里获取资源文件并读取它。 需要注意的是,您自己的文件夹/文件与AppFolder之间的主要区别在于,用户无法读取AppF的内容 较旧,但仍可以删除它

下面是如何将byte[]缓冲区写入文件。它是“wait”版本以使其简单化,但有一个异步版本“createFileAsync”

关于身份证:


上面提到的DriveId是一个对象,可以转换为2个不同的字符串,如中所述。选择哪一个取决于你自己。“encodeToString”中较长的一个更容易通过“decodeFromString”转换回DriveId,较短的一个可以在http地址中很容易识别,但需要使用async/await方法来获取DriveId-fetchDriveId。

huh,好的。非常感谢你。几乎可以肯定的是,有一些限制说,该应用程序只能访问自己创建的文件,但很棒。我只是喜欢游戏服务的不断改进。我想我会去列出所有文件,并寻找我的文件夹解决方案,哈。再次谢谢,嗯,好的。非常感谢你。几乎可以肯定的是,有一些限制说,该应用程序只能访问自己创建的文件,但很棒。我只是喜欢游戏服务的不断改进。我想我会去列出所有文件,并寻找我的文件夹解决方案,哈。再次感谢。如果这听起来像是无耻的自我推销,相信我,那就是:因为你可能正在经历和我一样的迷宫,我建议你从github这里提取代码,测试你所有的理论,并在它们在你的应用程序中击中你之前找到障碍。它是一个没有UI的单一文件,涵盖了所有主要功能。”await'versions in AsyncTask'应该很容易完成。在雅各布:我脑海中突然出现了另一件事:如果你的应用程序处理多个帐户,将配置保存在驱动器的已知位置可以让你为每个用户下载正确的应用程序状态。以一种与问题无关的方式,你的回答帮助了我,因此,这里是我的投票^ ^如果这听起来像是无耻的自我推销,相信我,这是:因为你可能正在经历和我一样的迷宫,我建议你从github这里提取代码来测试你的所有理论,并在它们在你的应用程序中击中你之前找到障碍。它是一个没有UI的单一文件,涵盖了所有主要功能。”await'versions in AsyncTask'应该很容易完成。在雅各布:我脑海中突然出现了另一件事:如果你的应用程序处理多个帐户,将配置保存在驱动器的已知位置可以让你为每个用户下载正确的应用程序状态。以一种与问题无关的方式,你的回答帮助了我,这是我的一票^_^
 public DriveFile createFileWait(DriveFolder fldr, String name, String mime, byte[] buff) {
  DriveFile drvFile = null;
  if (isConnected()) try { 
    ContentsResult rslt = Drive.DriveApi.newContents(_gac).await();
    if (rslt.getStatus().isSuccess()) {
      Contents cont = rslt.getContents();    
      cont.getOutputStream().write(buff);
      MetadataChangeSet meta = (mime == null) ?
          new MetadataChangeSet.Builder().setTitle(name).build() :
          new MetadataChangeSet.Builder().setTitle(name).setMimeType(mime).build();
      drvFile = fldr.createFile(_gac, meta, cont).await().getDriveFile();
    }
  } catch (Exception e) {}
  return drvFile;
}