未使用 Google Drive API 调用 onActivityResult

Posted

技术标签:

【中文标题】未使用 Google Drive API 调用 onActivityResult【英文标题】:onActivityResult not called using Google Drive API 【发布时间】:2021-06-14 02:06:51 【问题描述】:

我正在尝试使用 Google Drive API 将文件上传到 Drive。但是,在我下面的代码中

startActivityForResult(signInIntent, 400);

它永远不会到达 onActivityResult,它只是直接使用 null driveServiceHelper 进入 uploadPdfFile()。

我已经查看了我在这里找到的几件事,但这似乎是一个不同的问题?我是 android 的初学者,所以也许我忽略了一些东西?谢谢。

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        
    );

    requestSignIn();
    uploadPdfFile();
 

private void uploadPdfFile() 
    ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
    progressDialog.setTitle("Uploading to Google Drive");
    progressDialog.setMessage("Please wait...");
    progressDialog.show();

    String filePath = "/storage/emulated/0/mypdf.pdf";
    driveServiceHelper.createFilePDF(filePath)
            .addOnSuccessListener(new OnSuccessListener<String>() 
                @Override
                public void onSuccess(String s) 
                    progressDialog.dismiss();
                    Toast.makeText(getApplicationContext(), "Upload successfully", Toast.LENGTH_LONG).show();
                
            )
            .addOnFailureListener(new OnFailureListener() 
                @Override
                public void onFailure(@NonNull Exception e) 
                    progressDialog.dismiss();
                    Toast.makeText(getApplicationContext(), "Check your drive api key", Toast.LENGTH_LONG).show();
                
            );


DriveServiceHelper driveServiceHelper;

private void requestSignIn() 
    GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestScopes(new Scope(DriveScopes.DRIVE_FILE))
            .build();
    GoogleSignInClient client = GoogleSignIn.getClient(this, signInOptions);
    Intent signInIntent = client.getSignInIntent();
    startActivityForResult(signInIntent, 400);


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) 
        case 400:
            if (resultCode == RESULT_OK) 
                handleSignalInIntent(data);
            
            break;
    


private void handleSignalInIntent(Intent data) 
    GoogleSignIn.getSignedInAccountFromIntent(data)
            .addOnSuccessListener(new OnSuccessListener<GoogleSignInAccount>() 
                @Override
                public void onSuccess(GoogleSignInAccount googleSignInAccount) 
                    GoogleAccountCredential credential = GoogleAccountCredential
                            .usingOAuth2(MainActivity.this, Collections.singleton(DriveScopes.DRIVE_FILE));
                    credential.setSelectedAccountName(googleSignInAccount.getAccount().name);
                    Drive googleDriveService = new Drive.Builder(
                            AndroidHttp.newCompatibleTransport(),
                            new GsonFactory(),
                            credential)
                            .setApplicationName("My Drive Tutorial")
                            .build();

                    driveServiceHelper = new DriveServiceHelper(googleDriveService);
                
            )
            .addOnFailureListener(new OnFailureListener() 
                @Override
                public void onFailure(@NonNull Exception e) 
                
            );

这几乎是项目中的所有代码。 (除了 DriveServiceHelper)

【问题讨论】:

切换结束后放入super.onActivityResult(requestCode, resultCode, data); @javdromero 我试过了,但没有帮助。使用调试器,代码永远不会到达“onActivityResult”,根本没有调用。 首先你正在调用 requestSignIn 方法。只要行 startActivityForResult(signInIntent, 400);执行后,控制转到uploadPdfFile 方法调用。那时你的 driveServiceHelper 没有初始化。 在初始化 DriveServiceHelper 后,driveServiceHelper() 是否必须在 handleSignalInIntent() 中? 要处理这个问题,在调用uploadPdfFile方法之前,首先你必须检查你是否已经在唱歌。如果已经登录,则仅调用 uploadPdfFile 方法。否则调用 requestSignIn 方法。在这条线之后 driveServiceHelper = new DriveServiceHelper(googleDriveService);调用uploadPdfFile() 【参考方案1】:

Root cause: 首先,您正在调用requestSignIn 方法。只要startActivityForResult(signInIntent, 400); 行执行, 控制转到uploadPdfFile 方法调用。那时你的driveServiceHelper 没有初始化。

要处理这个问题,在调用uploadPdfFile 方法之前,首先你必须检查你是否已经在唱歌。如果已经登录,则只调用uploadPdfFile 方法。否则调用requestSignIn 方法。 在这一行之后

driveServiceHelper = new DriveServiceHelper(googleDriveService); 
uploadPdfFile() 

【讨论】:

以上是关于未使用 Google Drive API 调用 onActivityResult的主要内容,如果未能解决你的问题,请参考以下文章

参数列表文件API调用Google Drive API中的created_at属性

从 Google Drive V3 API 中的回收站恢复文件时未设置时间戳

使用 REST api 从 Google Drive 下载图片

如何在使用Google Drive API V3与他人共享时设置文件的功能?

使用API 恢复Google Drive Spreadsheet的修订版

在 Laravel 5 中使用 Google Drive Api