微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Android App中设置Google Drive Credentials?

该应用程序在“Google Api控制台”中注册为“已安装的应用程序” – 似乎这是Android应用程序的正确设置,不是吗?

所以我确实有一个Client-Id而且没有Secret-Id.要说清楚:它不是Web应用程序,也不是Google Drive-App–它是一个Android应用程序,用于访问Google云端硬盘云中的其他用户数据.

在应用程序中我获取帐户(工作),我确实请求令牌(工作).现在,我想使用该令牌和Client-Id连接到Google云端硬盘.结果是“401,无效凭证”.这段代码出了什么问题?

public class ActivityMain extends Activity implements DialogInterface.OnClickListener {

    // https://developers.google.com/drive/scopes
    private static final String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/drive";

    // https://code.google.com/apis/console/
    private static final String CLIENT_ID = "999999999999999.apps.googleusercontent.com";

    private AccountManager accountManager;
    private Account[] accounts;
    private String authName;
    private String authToken;

    @Override
    public void onClick(final DialogInterface dialogInterface, final int item) {

        processAccountSelected(accounts[item]);
    }

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

        setContentView(R.layout.activitymain);

        accountManager = AccountManager.get(this);
        accounts = accountManager.getAccountsByType("com.google");

        if (accounts == null || accounts.length == 0) {
            // Todo
        } else if (accounts.length == 1) {
            processAccountSelected(accounts[0]);
        } else if (accounts.length > 1) {
            showDialog(MyConstants.DIALOG_ACCOUNTCHOSER);
        }
    }

    @Override
    protected Dialog onCreateDialog(final int id) {
        switch (id) {
            case MyConstants.DIALOG_ACCOUNTCHOSER:
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

                String[] names = new String[accounts.length];

                for (int i = 0; i < accounts.length; i++) {
                    names[i] = accounts[i].name;
                }

                alertDialogBuilder.setItems(names, this);
                alertDialogBuilder.setTitle("Select a Google account");
                return alertDialogBuilder.create();
        }

        return null;
    }

    private void processAccountSelected(final Account account) {
        if (account != null) {
            authName = account.name.toString();
            if (!Tools.isEmpty(authName)) {
                Toast.makeText(this, authName, Toast.LENGTH_LONG).show();

                accountManager.getAuthToken(account, AUTH_TOKEN_TYPE, null, this,
                        new AccountManagerCallback<Bundle>() {

                            public void run(final AccountManagerFuture<Bundle> future) {
                                try {
                                    authToken = future.getResult().getString(
                                            AccountManager.KEY_AUTHTOKEN);
                                    processtokenReceived();
                                } catch (OperationCanceledException exception) {
                                    // Todo
                                } catch (Exception exception) {
                                    Log.d(this.getClass().getName(), exception.getMessage());
                                }
                            }
                        }, null);
            }
        }
    }

    private void processListFiles(final Drive drive) {
        List<File> result = new ArrayList<File>();
        Files.List request = null;
        try {
            request = drive.files().list();
        } catch (IOException exception) {
        }

        do {
            try {
                FileList files = request.execute();

                result.addAll(files.getItems());
                request.setPagetoken(files.getNextPagetoken());
            } catch (IOException exception) {
                // --> 401 invalid credentials
            }
        } while (request.getPagetoken() != null && request.getPagetoken().length() > 0);
    }

    private void processtokenReceived() {
        if (!Tools.isEmpty(authToken)) {
            final HttpTransport transport = AndroidHttp.newCompatibleTransport();
            final JsonFactory jsonFactory = new GsonFactory();
            GoogleCredential credential = new GoogleCredential();
            credential.setAccesstoken(authToken);
            Drive drive = new Drive.Builder(transport, jsonFactory, credential)
                    .setApplicationName(getString(R.string.txt_appname))
                    .setJsonHttpRequestinitializer(new GoogleKeyInitializer(CLIENT_ID))
                    .build();

            if (drive != null) {
                processListFiles(drive);
            }
        }
    }
}

我不得不说这是一堆乱七八糟的东西.网页上有很多页面显示部分,有很多页面使用弃用,缺失或不同的方法来做同样的事情.在我看来,有两个页面显示了从Android应用中从Google云端硬盘获取数据的相同方式.

任何帮助都非常感谢.

编辑:我可以自己解决.这是不同变化的组合:

>必须设置android:minSdkVersion =“11”作为要求
>不得不使用当前的库:google-api-client-1.11.0-beta.jar,google-api-client-android-1.11.0-beta.jar,google-api-services-drive-v2-rev9- 1.8.0-beta.jar,google-http-client-1.11.0-beta.jar,google-http-client-android-1.11.0-beta.jar,google-http-client-gson-1.11.0- beta.jar,google-http-client-jackson2-1.11.0-beta.jar,google-oauth-client-1.11.0-beta.jar,gson-2.1.jar,guava-11.0.1.jar,jackson- core-2.0.5.jar,jsr305-1.3.9.jar

这是获取Drive对象的当前部分:

    GoogleCredential credential = new GoogleCredential();
    credential.setAccesstoken(authToken);

    HttpTransport transport = AndroidHttp.newCompatibleTransport();

    JsonFactory jsonFactory = new AndroidJsonFactory();

    drive = new Drive.Builder(transport, jsonFactory, credential)
            .setApplicationName(getString(R.string.txt_appname))
            .setJsonHttpRequestinitializer(
                    new GoogleKeyInitializer(APIKEY_SIMPLE))
            .build();
    if (drive != null) {
    }

解决方法:

是的,文档很难流行.

只是改变

new GoogleKeyInitializer(CLIENT_ID)

new GoogleKeyInitializer(SIMPLE_API_ACCESS_KEY)

它应该工作.

您可以在API访问页面的简单API访问部分(API密钥)下的Google APIs Console中找到您的SIMPLE_API_ACCESS_KEY.如果此部分不可用,则必须先在“服务”页面上激活Drive API访问权限.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐