2014-03-18 1 views
4
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.IntentSender; 
import android.content.IntentSender.SendIntentException; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.util.Log; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks; 
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; 
import com.google.android.gms.drive.Drive; 
import com.google.android.gms.drive.DriveApi.ContentsResult; 
import com.google.android.gms.drive.MetadataChangeSet; 


public class Phototodrive 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).setResultCallback(new ResultCallback<ContentsResult>() { 


      public void onResult(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, "GoogleApiClient connection suspended"); 
    } 





} 

나는 안드로이드 구글 드라이브 API 빠른 시작 응용 프로그램을 실행하려고 해요. ResultCallback
가 어떻게 변경해야 , 또는 왜 내가이 오류를 얻고 유형에 해결 될 수없는 -
이 PendingResult 메소드 setResultCallback (새 ResultCallback() {}) 유형에 대한 정의되지 않은 -
나는 과 같은 오류를 얻을 ?setResultCallback 메서드를 사용하는 방법은 무엇입니까?

답변

1

'onDisconnect()'의 존재 여부로 판단되는 코드는 오래된 것입니다 (Google Play 서비스 버전 14). 버전 15 (Android SDK 관리자)가 있는지 확인한 다음 quickstart, demos 또는 this code을 시도해보세요. 기기가 Google Play 서비스 4.2에 있어야합니다 ...

+0

대단히 감사합니다. 문제는 최신 Google Play 서비스로 업데이트 한 후 패키지에서 .jar 파일을 변경하지 못했습니다. – Zsombor

+0

동일한 문제에 직면하고 있지만 최신 Google Play 서비스가 있습니다. 도울 수 있니? –

+0

Android Studio 1.1을 사용중인 경우 https://github.com/seanpjanson/GDAADemo에서 추가 정보를 얻을 수 있습니다 (http://stackoverflow.com/questions/28439129/how-to-acknowledge-when). -user-doesnt-want-to-go-go-go-play-services – seanpj