2017-04-11 3 views
0

Google 드라이브 API를 사용하여 사용자가 파일을 선택하고 (지금까지) 메타 데이터를 가져올 수 있습니다. 나는 (추출) 어디에 있어요 여기Android : Google 드라이브 getMetaData()가 콜백을 호출하지 않습니다.

는 다음과 같습니다

@Override 
public void onConnected(Bundle connectionHint) { 
    super.onConnected(connectionHint); 
    IntentSender intentSender = Drive.DriveApi 
     .newOpenFileActivityBuilder() 
     .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) { 
       if (data != null) { 
        DriveId driveId = data.getParcelableExtra(OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); 
        Log.d(TAG, "driveId = " + driveId.encodeToString()); 
        //driveId.asDriveResource().getMetadata(getGoogleApiClient()) 
        driveId.asDriveFile().getMetadata(getGoogleApiClient()) 
         .setResultCallback(new ResultCallback<DriveResource.MetadataResult>() { 
          public void onResult(@NonNull DriveResource.MetadataResult mdr) { 
           // Never gets here 
          } 
         }); 
       } 
      } 
      break; 
     default: 
      super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

은 잘 작동하는 것 같다. 그것은 DriveId을 기록하고 getMetadata() 호출을 찾습니다. 하지만 결코 콜백을 호출하지 않습니다. onResult()에 도달하지 못했습니다.

API 문서와 Google 예제 코드를 연구 할 때 분명히 잘못된 점을 분명히하고있는 것처럼 느껴질 수 있습니다.

편집 추가 :

내가 setResultCallback() await()에 (스레드에서) 사용에서 변경하려고했으나 DriveID 다시 괜찮 동안 MetadataResult이있다

CANCELEDstatusCode (나는 선택을 클릭해도 드라이브 파일 선택기에서). 따라서 getMetadata()을 호출하면 null이 반환됩니다.

상황이 잘못 될 수 있다는 점을 더 시사합니까?

답변

0

확인 된 getMetaData는(). setResultCallBack() 코드 위의 코드에서 here

, 당신은 빈 onResult 블록을 유지했다. onResult 블록에서 MetaDataResult obj를 사용하여 원하는 파일/폴더에 대한 메타 데이터를 가져와야합니다. 상태

확인 메타 데이터에 대한 자세한 내용은 MetaDataResult OBJ

final ResultCallback<MetadataResult> metadataCallback = new ResultCallback<MetadataResult>() { 
    @Override 
    public void onResult(MetadataResult result) { 
     if (!result.getStatus().isSuccess()) { 
      showMessage("Problem while trying to retrieve the file metadata"); 
      return; 
     } 
     if (result.getMetadata().isPinnable()) { 
      showMessage("File is pinnable"); 
     } 
}; 

에 성공하지 볼 경우 android doc


의 메타 데이터 콜백이 성공하지 않은 경우 일치하지 driveId 이잖아

해당 SO 스레드의 메소드를 사용하여 해당 파일의 올바른 ID를 얻으십시오. link

u는 u는 얻을 driveId에서이 작업을 수행 할 수 있습니다 :

Drive.DriveApi.fetchDriveId(getGoogleApiClient(), driveId.getResourceId()).setResultCallback(idCallback); 

final ResultCallback<DriveApi.DriveIdResult> idCallback = new ResultCallback<DriveApi.DriveIdResult>() { 
    @Override 
    public void onResult(DriveApi.DriveIdResult result) { 
     if (!result.getStatus().isSuccess()) { 
      showMessage("Cannot find DriveId. Are you authorized to view this file?"); 
      return; 
     } 
     DriveId driveId = result.getDriveId(); 
     showLogDebug(driveId + " in idCallback of fetchId"); 
     DriveFile file = driveId.asDriveFile(); 
     file.getMetadata(getGoogleApiClient()).setResultCallback(metadatacallBack); 

} 을};

+0

감사합니다. 미안합니다. 예를 간단하게하기 위해 실제 onResult 코드를 제거하고 그 주석으로 대체했습니다. 실행은 어디에도 없었습니다. 내가 준 예제에서, 거기에 코드를 넣었 으면 결코 isSuccess()를 체크하지 않을 것이다. –

관련 문제