错误:ConnectionResult {statusCode = INTERNAL_ERROR,resolution = null}

我正在开发应用程序,将Google Drive集成到我的应用程序中。 下面是我简单地从示例代码中复制的代码,但在与Google云端硬盘连接时出现exception。

exception:onConnectionFailed()方法中的ConnectionResult{statusCode=INTERNAL_ERROR, resolution=null}

请大家分享你的看法。

 public class MainActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener { private static final String TAG = "android-drive-quickstart"; private static final int REQUEST_CODE_CAPTURE_IMAGE = 1; private static final int REQUEST_CODE_CREATOR = 2; private static final int REQUEST_CODE_RESOLUTION = 3; private GoogleApiClient mGoogleApiClient; private Bitmap mBitmapToSave; /** * Create a new file and save it to Drive. */ private void saveFileToDrive() { // Start by creating a new contents, and setting a callback. Log.i(TAG, "Creating new contents."); final Bitmap image = mBitmapToSave; Drive.DriveApi.newContents(mGoogleApiClient).addResultCallback(new OnNewContentsCallback() { @Override public void onNewContents(ContentsResult result) { // If the operation was not successful, we cannot do anything // and must // fail. if (!result.getStatus().isSuccess()) { Log.i(TAG, "Failed to create new contents."); return; } // Otherwise, we can write our data to the new contents. Log.i(TAG, "New contents created."); // Get an output stream for the contents. OutputStream outputStream = result.getContents().getOutputStream(); // Write the bitmap data from it. ByteArrayOutputStream bitmapStream = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.PNG, 100, bitmapStream); try { outputStream.write(bitmapStream.toByteArray()); } catch (IOException e1) { Log.i(TAG, "Unable to write file contents."); } // Create the initial metadata - MIME type and title. // Note that the user will be able to change the title later. MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder() .setMimeType("image/jpeg").setTitle("Android Photo.png").build(); // Create an intent for the file chooser, and start it. IntentSender intentSender = Drive.DriveApi .newCreateFileActivityBuilder() .setInitialMetadata(metadataChangeSet) .setInitialContents(result.getContents()) .build(mGoogleApiClient); try { startIntentSenderForResult( intentSender, REQUEST_CODE_CREATOR, null, 0, 0, 0); } catch (SendIntentException e) { Log.i(TAG, "Failed to launch file chooser."); } } }); } @Override protected void onResume() { super.onResume(); if (mGoogleApiClient == null) { // Create the API client and bind it to an instance variable. // We use this instance as the callback for connection and connection // failures. // Since no account name is passed, the user is prompted to choose. mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Drive.API) .addScope(Drive.SCOPE_FILE) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); } // Connect the client. Once connected, the camera is launched. mGoogleApiClient.connect(); } @Override protected void onPause() { if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } super.onPause(); } @Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { switch (requestCode) { case REQUEST_CODE_CAPTURE_IMAGE: // Called after a photo has been taken. if (resultCode == Activity.RESULT_OK) { // Store the image data as a bitmap for writing later. mBitmapToSave = (Bitmap) data.getExtras().get("data"); } break; case REQUEST_CODE_CREATOR: // Called after a file is saved to Drive. if (resultCode == RESULT_OK) { Log.i(TAG, "Image successfully saved."); mBitmapToSave = null; // Just start the camera again for another photo. startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), REQUEST_CODE_CAPTURE_IMAGE); } break; } } @Override public void onConnectionFailed(ConnectionResult result) { // Called whenever the API client fails to connect. Log.i(TAG, "GoogleApiClient connection failed: " + result.toString()); if (!result.hasResolution()) { // show the localized error dialog. GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show(); return; } // The failure has a resolution. Resolve it. // Called typically when the app is not yet authorized, and an // authorization // dialog is displayed to the user. try { result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION); } catch (SendIntentException e) { Log.e(TAG, "Exception while starting resolution activity", e); } } @Override public void onConnected(Bundle connectionHint) { Log.i(TAG, "API client connected."); if (mBitmapToSave == null) { // This activity has no UI of its own. Just start the camera. startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), REQUEST_CODE_CAPTURE_IMAGE); return; } saveFileToDrive(); } @Override public void onDisconnected() { Log.i(TAG, "API client disconnected."); } } 

小心! 在Developers Console中存在问题。

如果在1)确认你已经注册了包名和相应的证书指纹 ,并且2)(重新)使用了一个已经存在的项目, 那么你应该检查这个项目是否有产品名称 ,一个电子邮件地址 (双重检查一个特别的)与它相关联,都可以在“ 同意屏幕 ”部分find。

很旧的项目可能没有这两个字段填充。 较新的项目有这些填写了一些默认值的字段。

花了我一天的时间来find这个…

在这里输入图像描述

我从注册应用程序解决了问题,并生成签名证书指纹。

https://developers.google.com/drive/android/auth#generate_the_signing_certificate_fingerprint_and_register_your_application

我跟着上面的链接,它解决了我的问题。

我通过在API控制台上签署我的Google云端硬盘应用程序来解决这个问题

  1. 转到Google Developers Console。
  2. select一个项目,或者创build一个新项目。
  3. 在左侧的边栏中,展开API和身份validation。 接下来,点击API。
  4. 在API列表中,确保Drive API的状态为ON。
  5. 在左边的边栏中,select凭证。

如果您的应用程序需要提交授权的请求:

  1. 在OAuth下,点击创build新的客户端ID。
  2. select已安装的应用程序和Android。
  3. 在包名称字段中,input您的Android应用程序包名称。
  4. 将SHA1指纹粘贴到请求的表单中。
  5. 点击创build客户端ID。

对我来说,问题是,在这个例子中有:

 .addApi(Drive.API) 

而且我没有在控制台中添加驱动器API

这个错误消息帮助我弄清楚了这个问题

com.google.android.gms.drive.auth.c:授权失败:服务器返回错误:Access未configuration。 您的项目未启用API,或者您的API密钥上configuration了per-IP或per-Referer限制,并且请求不符合这些限制。 请使用Google Developers Console更新您的configuration。有关详情,请参阅https://developers.google.com/drive/handle-errors

不要忘记权限:

 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

logcat中是否有错误信息? 连接失败最可能的原因是您没有在云端控制台中正确设置应用程序。

请参阅此处的说明: https : //developers.google.com/drive/android/auth

在我的情况下,我必须更改客户端ID以使用构buildGoogleApiClient对象的活动类的确切包名称,而不是更高级别的包。

我也遇到了同样的错误。 对于我的项目,Drive API在API&auth – > API下未启用。 启用此Drive API后,此问题已解决。

我解决了将此行添加到gradle:

 compile 'com.google.android.gms:play-services-identity:8.1.0' 

您需要有两个独立的客户端ID,一个用于debugging,另一个用于发布。 有时候我们想念这个明显的

在Android Studio中转到

工具 – > Android的SDKpipe理器 – >谷歌播放服务

更新Google Play服务 ..我相信它会起作用

当我将现有的应用程序从Eclipse移动到Android Studio时,我遇到了同样的问题。 我的问题是我命名applicationId不同于包ID。 将applicationId更改为与包名相同解决了问题。