Google Drive SDK:Drive QuickStart App示例在Android上无效

时间:2013-04-03 14:53:17

标签: google-drive-api

Drive QuickStart App示例不适用于Android(https://developers.google.com/drive/quickstart-android)。

我在Android 4.1.2上运行了Note 2。我按照教程中的所有步骤(使用eclipse + ADT + google控制台),花了30多个小时。

以下行中有一个“ClassNotFoundException”: 文件file = service.files()。insert(body,mediaContent).execute();

我发现Drive.Files.Insert.execute()部分发生了异常。

有没有人能够使这款相机应用程序正常工作?我看了这个应用程序的视频教程,甚至开发人员说应用程序只是“可能会起作用”......

互联网上是否有经过确认的Drive SDK应用程序?我想要做的就是从谷歌硬盘下载一个简单的谷歌电子表格。

我尝试过的其他事情: - Google提供的DrEdit示例应用也无法与Google驱动器正常同步。 - 我也无法在Google文档列表API网站上找到可用的示例应用程序。

我认为从Android访问Google云端硬盘应该是一个简单的任务,附带一个示例......否则,人们不妨使用DropBox。

谢谢!

2 个答案:

答案 0 :(得分:1)

当我在寻找如何从Drive打开一个电子表格时,我通过相同的QuickStart应用程序,我使用的是Eclipse Juno,Windows 7,64位。我观看了两个视频,第二个是Integerate with the Android Drive App

我使用了两者中的步骤,特别是在我的清单xml中。我不得不两次去录像,以确保我完成了所有步骤。我必须将用户功能添加到我的清单中。

 <uses-feature android:name="android.hardware.camera" />

我发现了其他一些事情。我根本无法在模拟器上运行它。在调试模式下在手机上运行它也不能最初工作,它可以访问手机的SD卡(显然)。我将APK复制到手机上并安装了它,确保您的安全设置放松。它没有通过亚行束缚我的手机(Jellybean Droid Razr)。

这是我的大部分内容。请注意,您必须从API控制台替换'YOURCLIENTID'。我只使用了第一组数字,在' - '之后没有,即123456789-blah,等等。只是123456789。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.birdsall.tda"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.camera" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    android:uiOptions="splitActionBarWhenNarrow"
     android:exported="true" >

    <meta-data android:name="com.google.android.apps.drive.APP_ID" android:value="id=YOURCLIENTID" />

    <intent-filter>
    <action android:name="com.google.android.apps.drive.DRIVE_OPEN" />
    <data android:mimeType="application/vnd.google-apps.drive-sdk.YOURCLIENTID" />
    <data android:mimeType="image/png" />
    <data android:mimeType="image/jpeg" />
    <data android:mimeType="image/jpg" />
    </intent-filter>

    <meta-data
        android:name="android.app.default_searchable"
        android:value=".ActivitySearch" />

    <activity
        android:name="com.birdsall.tda.ActivityMain"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".ActivityTakePhoto" >
    </activity>


    <provider
        android:name="com.birdsall.tda.TDAProvider"
        android:authorities="com.birdsall.tda.contentprovidertda"
        android:exported="true"
        android:readPermission="true"
        android:writePermission="true" />

    <activity
        android:name=".ActivitySearch"
        android:label="Rule Search"
        android:launchMode="singleTop" >
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>
</application>

</manifest>

我想我只更改了活动的类名,否则我没有更改任何java代码。这是我的活动:

package com.birdsall.tda;


import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import android.accounts.AccountManager;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.widget.Toast;

import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException;
import com.google.api.client.http.FileContent;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;

public class ActivityTakePhoto extends Activity {
static final int REQUEST_ACCOUNT_PICKER = 1;
static final int REQUEST_AUTHORIZATION = 2;
static final int CAPTURE_IMAGE = 3;

private static Uri fileUri;
private static Drive service;
private GoogleAccountCredential credential;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

credential = GoogleAccountCredential.usingOAuth2(this, DriveScopes.DRIVE);
startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
switch (requestCode) {
case REQUEST_ACCOUNT_PICKER:
  if (resultCode == RESULT_OK && data != null && data.getExtras() != null) {
    String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
    if (accountName != null) {
      credential.setSelectedAccountName(accountName);
      service = getDriveService(credential);
      startCameraIntent();
    }
  }
  break;
case REQUEST_AUTHORIZATION:
  if (resultCode == Activity.RESULT_OK) {
    saveFileToDrive();
  } else {
    startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
  }
  break;
case CAPTURE_IMAGE:
  if (resultCode == Activity.RESULT_OK) {
    saveFileToDrive();
  }
}
}

private void startCameraIntent() {
String mediaStorageDir = Environment.getExternalStoragePublicDirectory(
    Environment.DIRECTORY_PICTURES).getPath();
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date());
fileUri = Uri.fromFile(new java.io.File(mediaStorageDir + java.io.File.separator + "BCM_IMG_"
    + timeStamp + ".jpg"));

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(cameraIntent, CAPTURE_IMAGE);
  }

 private void saveFileToDrive() {
Thread t = new Thread(new Runnable() {
  @Override
  public void run() {
    try {
      // File's binary content
      java.io.File fileContent = new java.io.File(fileUri.getPath());
      FileContent mediaContent = new FileContent("image/jpeg", fileContent);

      // File's metadata.
      File body = new File();
      body.setTitle(fileContent.getName());
      body.setMimeType("image/jpeg");

      File file = service.files().insert(body, mediaContent).execute();
      if (file != null) {
        showToast("Photo uploaded: " + file.getTitle());
        startCameraIntent();
      }
    } catch (UserRecoverableAuthIOException e) {
      startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
 });
 t.start();
 }

 private Drive getDriveService(GoogleAccountCredential credential) {
 return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential)
    .build();
}

public void showToast(final String toast) {
runOnUiThread(new Runnable() {
  @Override
  public void run() {
    Toast.makeText(getApplicationContext(), toast, Toast.LENGTH_LONG).show();
  }
});
  }
}

希望这有帮助。

答案 1 :(得分:0)

不确定这对你有多大帮助,但是,是的,我使用了Eclipse / Kepler的QuickStart应用程序。我在Eclipse / Juno上遇到了很多问题,并且还阅读了关于Juno和ADT如何不能正确对齐的帖子。

我目前正在使用部分代码将手机中的文本文件上传到云端硬盘。我有一台运行4.2.2的Nexus 4。我注意到Quickstart应用程序的最低API级别为4.2,因此可能存在问题所在。您是否在4.2模拟器而不是笔记上尝试过它?

是的,这是一项简单的任务,但必须正确设置 。 Drive有自己处理文件的方式(即不会覆盖同名文件,只创建另一个文件)。