2015-04-17 24 views
5

Qui di seguito è il mio codice:dati intento è onActivityResult nulla dopo selezionare Account in Google Drive api in Android

BaseDemoActivity:

public abstract class BaseDemoActivity extends Activity implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    private static final String TAG = "BaseDriveActivity"; 

    /** 
    * DriveId of an existing folder to be used as a parent folder in 
    * folder operations samples. 
    */ 
    public static String EXISTING_FOLDER_ID = "CAESHDBCMlBoNlZTdkpaR2FTRTFaWW5wclNXRlFabXMYOiCWqeuO-FI="; 

    /** 
    * DriveId of an existing file to be used in file operation samples.. 
    */ 
    public static final String EXISTING_FILE_ID = "CAESHDBCMlBoNlZTdkpaR2FTRTFaWW5wclNXRlFabXMYOiCWqeuO-FI="; 

    /** 
    * Extra for account name. 
    */ 
    protected static final String EXTRA_ACCOUNT_NAME = "account_name"; 

    /** 
    * Request code for auto Google Play Services error resolution. 
    */ 
    protected static final int REQUEST_CODE_RESOLUTION = 1; 

    /** 
    * Next available request code. 
    */ 
    protected static final int NEXT_AVAILABLE_REQUEST_CODE = 2; 

    /** 
    * Google API client. 
    */ 
    public GoogleApiClient mGoogleApiClient; 

    /** 
    * Called when activity gets visible. A connection to Drive services need to 
    * be initiated as soon as the activity is visible. Registers 
    * {@code ConnectionCallbacks} and {@code OnConnectionFailedListener} on the 
    * activities itself. 
    */ 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (mGoogleApiClient == null) { 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addApi(Drive.API) 
        .addScope(Drive.SCOPE_FILE) 
        .addScope(Drive.SCOPE_APPFOLDER) // required for App Folder sample 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .build(); 
     } 
     mGoogleApiClient.connect(); 
    } 

    /** 
    * Handles resolution callbacks. 
    */ 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
      Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == REQUEST_CODE_RESOLUTION && resultCode == RESULT_OK) { 
      mGoogleApiClient.connect(); 
     } 
    } 

    /** 
    * Called when activity gets invisible. Connection to Drive service needs to 
    * be disconnected as soon as an activity is invisible. 
    */ 
    @Override 
    protected void onPause() { 
     if (mGoogleApiClient != null) { 
      mGoogleApiClient.disconnect(); 
     } 
     super.onPause(); 
    } 

    /** 
    * Called when {@code mGoogleApiClient} is connected. 
    */ 
    @Override 
    public void onConnected(Bundle connectionHint) { 
     Log.i(TAG, "GoogleApiClient connected"); 
    } 

    /** 
    * Called when {@code mGoogleApiClient} is disconnected. 
    */ 
    @Override 
    public void onConnectionSuspended(int cause) { 
     Log.i(TAG, "GoogleApiClient connection suspended"); 
    } 

    /** 
    * Called when {@code mGoogleApiClient} is trying to connect but failed. 
    * Handle {@code result.getResolution()} if there is a resolution is 
    * available. 
    */ 
    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     Log.i(TAG, "GoogleApiClient connection failed: " + result.toString()); 
     if (!result.hasResolution()) { 
      // show the localized error dialog. 
      GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show(); 
      return; 
     } 
     try { 
      result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION); 
     } catch (SendIntentException e) { 
      Log.e(TAG, "Exception while starting resolution activity", e); 
     } 
    } 

    /** 
    * Shows a toast message. 
    */ 
    public void showMessage(String message) { 
     Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
    } 

    /** 
    * Getter for the {@code GoogleApiClient}. 
    */ 
    public GoogleApiClient getGoogleApiClient() { 
     return mGoogleApiClient; 
    } 


} 

PickfolderActivity:

public class PickFolderWithOpenerActivity extends BaseDemoActivity { 

    private static final String TAG = "PickFolderWithOpenerActivity"; 

    private static final int REQUEST_CODE_OPENER = 1; 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     super.onConnected(connectionHint); 

     IntentSender intentSender = Drive.DriveApi 
       .newOpenFileActivityBuilder() 
       .setMimeType(new String[] { DriveFolder.MIME_TYPE }) 
       .build(getGoogleApiClient()); 
     try { 
      startIntentSenderForResult(
        intentSender, REQUEST_CODE_OPENER, null, 0, 0, 0); 
     } catch (SendIntentException e) { 
      Log.w(TAG, "Unable to send intent", e); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch(requestCode) { 
     case REQUEST_CODE_OPENER: 
      if (resultCode == RESULT_OK) { 
       DriveId driveId = (DriveId) data.getParcelableExtra(
         OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); 
       showMessage("Selected folder's ID: " + driveId.getResourceId().toString()); 
       BaseDemoActivity.EXISTING_FOLDER_ID = driveId.getResourceId().toString(); 
      } 
      finish(); 
      break; 
     default: 
      super.onActivityResult(requestCode, resultCode, data); 
      break; 
     } 
    } 

} 

Logcat:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.drive.testdemo/com.drive.testdemo.PickFolderWithOpenerActivity}: java.lang.NullPointerException 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3432) 
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3475) 
    at android.app.ActivityThread.access$1300(ActivityThread.java:139) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5086) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at com.drive.testdemo.PickFolderWithOpenerActivity.onActivityResult(PickFolderWithOpenerActivity.java:67) 
    at android.app.Activity.dispatchActivityResult(Activity.java:5446) 
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3428) 

risposta

0

Stavo affrontando lo stesso problema con la connessione, in seguito ho trovato la seguente soluzione,

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
    case REQUEST_CODE_OPENER: 
     if (resultCode == RESULT_OK) { 

      final DriveId folderId = (DriveId) data.getParcelableExtra(OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); 
      showMessage("Selected folder's ID: " + folderId); 

      AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){ 

       int intReturnType = 0; 
       @Override 
       protected void onPostExecute(Void result) { 
        //super.onPostExecute(result); 
        //Do Logic... 
       } 

       @Override 
       protected Void doInBackground(Void... params) { 

        ConnectionResult resultApi = getGoogleApiClient().blockingConnect(); 
        if (!resultApi.isSuccess()) { 
         return null; 
        } 

        @SuppressWarnings("deprecation") 
        DriveFolder folder = Drive.DriveApi.getFolder(getGoogleApiClient(), folderId); 
        DriveResource.MetadataResult result = folder.getMetadata(getGoogleApiClient()).await(); 
        if (!result.getStatus().isSuccess()) { 
         Log.d("Folder", "Problem while trying to fetch metadata."); 
         return null; 
        } 

        Metadata metadata = result.getMetadata(); 
        if (metadata.isTrashed()) { 
         Log.d("Folder", "Folder is trashed"); 
         return null; 
        } 

        Log.d("FolderName", metadata.getTitle()); 
        return null; 
       } 
      }; 
      task.execute(); 
     } 
     break; 
    default: 
     super.onActivityResult(requestCode, resultCode, data); 
     break; 
    } 
} 
+0

puoi spiegare perché è stato causato e quale parte del codice lo ha risolto? – suku

+0

@suku, Nel mio caso sto usando la stessa connessione per ottenere i file dalla cartella selezionata, quindi prima di accedere alla cartella selezionata, dovrebbe essere connesso/necessario ricollegare, controllare [qui] (https: // sviluppatori. google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient) per ** \t blockingConnect ** –