1

私が理解しているように、新しいGDAAを使用すると、フォルダーとそのコンテンツにアクセスするには、フォルダーのDriveIdが必要です。これにより、アプリは自分で作成したコンテンツにのみアクセスできるようになります。

これで、私のアプリはカスタム フォルダー内のユーザーの Google ドライブ アカウント (写真) にファイルをアップロードします。このフォルダーを最初に作成するときに、フォルダーの DriveId を Shared Preferences に保存して、後でさらにアップロードするためにフォルダーにアクセスできるようにします。私の問題は、ユーザーが複数のデバイスから写真にアクセスできるようにしたいことです (そのため、たとえば、タブレットを使用しているときに携帯電話からアップロードされた写真を見ることができます)。しかし、これはできません。両方のデバイスにフォルダの DriveId がありません。私が考えることができる唯一の解決策は、何らかのクラウド サービスを介してユーザーのデバイス間で DriveId を共有することですが、これは目的には非常に不便です。

何かご意見は?

4

2 に答える 2

3

恥知らずに自分をシェリルの相棒に昇進させたので、以前にこの試練を経験したことがあるので、具体的なポイントをいくつか挙げることができます. これは私がしたことです:

  1. システムルート「MyStupidAppRoot」にアプリの一意の「ルート」を作成します。ここでは、名前で作成しているため、主な課題にぶつかります。存在しないことに基づいて作成すると、信頼できない可能性がありますしかし、改善されつつあります. SO 22382099およびSO 22515028を参照してください.
  2. 信頼できるアンカー 'MyStupidAppRoot' を取得したら、Cheryl が言及したAppFolderを作成するか (まだ利用できません)、必要なものを保持できる独自の可視ファイルを作成できます (ここでも独自の作成課題です)。たとえば、すべての PREFERENCE 文字列のように。完全な SQLite DB ファイルをそこに保存する勇気さえありました。byte[] バッファをファイルに書き込むので可能です。
  3. それよりも、アプリを搭載した他のデバイスは「MyStupidAppRoot」を見つけ、そこからリソース ファイルを取得して読み取ることができます。

所有するフォルダー/ファイルとAppFolderの主な違いは、ユーザーはAppFolderの内容を読み取ることはできませんが、削除することはできることに注意してください。

byte[] バッファをファイルに書き込む方法は次のとおりです。簡単にするために「await」バージョンですが、ここに非同期バージョン「createFileAsync()」があります

 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;
}

ID について:

上記のDriveIdはオブジェクトであり、SO 21800257で説明されているように、2 つの異なる文字列に変換できます。どちらを選ぶかはあなた次第です。「encodeToString()」からの長いものは、「decodeFromString()」によって簡単に DriveId に戻すことができます。短いものは http アドレスで簡単に認識できますが、DriveId を取得するには async / await メソッドが必要です - fetchDriveId() .

于 2014-03-20T11:44:42.830 に答える
1

必ずしも DriveId を取得する必要はありません。フォルダを一意に識別するため、これが最も確実な方法です。タイトルに基づいてクエリを実行して、同じフォルダーを検索することもできます。Web と Android アプリがアプリ ID を共有すると仮定すると、どちらも同じファイルにアクセスできるはずです。

アプリ間で状態を共有するための簡単なオプションの 1 つは、新しくリリースされたアプリ フォルダー (Web ではアプリ データ フォルダーと呼ばれます) を利用することです。これは、アプリ固有のファイルを保存できる隠しフォルダーです。Android ドキュメントにはまだ記載されていませんが、Google Play Services 4.3 のロールアウトがリリースされるとすぐに表示されるはずです。http://android-developers.blogspot.com/2014/03/google-play-services-43.htmlを参照してください。

于 2014-03-19T20:21:39.847 に答える