【问题标题】:NullPointException on startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);在 startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION) 上出现 NullPointException;
【发布时间】:2013-10-07 02:21:21
【问题描述】:

所以我正在使用 Google Drive QuickStart 教程来帮助我了解与 Google Drive 交互的基础知识,并且代码在运行 Android 2.3.6 的 Samsung Ace 2 上运行良好,因此我能够 将文件上传到我的 Google Drive 空间。 我的问题是,当我在运行 Android 4.2.2 的三星 SII 上运行相同的应用程序时,它会找到该帐户并允许我创建一个新文件进行上传,但会崩溃:

startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);

LogCat 给了我以下信息:

03-26 18:29:39.686: E/AndroidRuntime(6775): FATAL EXCEPTION: Thread-256
03-26 18:29:39.686: E/AndroidRuntime(6775): java.lang.NullPointerException
03-26 18:29:39.686: E/AndroidRuntime(6775):     at android.app.Activity.startActivityForResult(Activity.java:3370)
03-26 18:29:39.686: E/AndroidRuntime(6775):     at android.app.Activity.startActivityForResult(Activity.java:3331)
03-26 18:29:39.686: E/AndroidRuntime(6775):     at com.blitz_labs.Google$3.run(Google.java:209)
03-26 18:29:39.686: E/AndroidRuntime(6775):     at java.lang.Thread.run(Thread.java:856)

相关代码

public void saveFileToDrive(final String fileName) {
Thread folder = new Thread(new Runnable() {

    @Override
      public void run() {
        try {

            Files.List request = service.files().list().setQ("mimeType='application/vnd.google-apps.folder' and trashed=false");

          final FileList files = request.execute();     
            request.setPageToken(files.getNextPageToken());
            if (!files.getItems().isEmpty()){
                for(int i=0; i < files.getItems().size(); i++){
                    if(files.getItems().get(i).getTitle().equals("APP FOLDER")){
                        parentKind = files.getItems().get(i).getKind();
                        parentID = files.getItems().get(i).getId();
                    } 
                } 
           }else{  


                 File body = new File();
                 body.setTitle("APP FOLDER");
                 body.setDescription("App folder");
                 body.setMimeType("application/vnd.google-apps.folder");
                // service is an authorized Drive API service instance
                File file = service.files().insert(body).execute();
                parentKind = file.getKind();
                parentID = file.getId();
                driveFile = file;

                        Log.v("file EXISTS HERE:",""+driveFile.getTitle());

            }

            String mediaStorageDir = "/sdcard/APP FOLDER/";
            fileUri = Uri.fromFile(new java.io.File(mediaStorageDir +java.io.File.separator + fileName));
          // File's binary content
          java.io.File fileContent = new java.io.File(fileUri.getPath());
          FileContent mediaContent = new FileContent("text/plain", fileContent);

          // File's metadata.
          File body = new File();  
          body.setTitle(fileContent.getName());
          body.setMimeType("text/plain");
          body.setParents(Arrays.asList(new ParentReference().setId(parentID) ));

          final File file1 = service.files().insert(body, mediaContent).execute();
          if (file1 != null) {   


               runOnUiThread(new Runnable() {
                      @Override
                      public void run() {
                        Toast.makeText(getApplicationContext() , "file uploaded: " + file.getTitle(), Toast.LENGTH_SHORT).show();
                        Log.v("SUCESSFULL UPLOADTO GOOGLEDRIVE",""+file1.getTitle());
                      }
                    });             
          }             

        } catch (UserRecoverableAuthIOException e) {
            startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
        } catch (IOException e) {
          e.printStackTrace();
        }

      }
});
folder.start();

  }

有人知道是什么原因造成的吗?

我已经包含了生成错误的文件上传功能。

提前感谢您的帮助。

【问题讨论】:

  • e 可能是null,你能把剩下的代码贴出来吗?
  • 问题解决了吗?我在 Galaxy Nexus 4.2.2 上遇到了完全相同的崩溃。我认为这可能是一个错误。
  • 是的,请看我的回答。请问您是否尝试在另一个类中从您的 google oauth 类中调用一个函数?如果您是,那么您的函数不会在您的 google oauth 类中调用任何其他内容。

标签: java android google-drive-api


【解决方案1】:

你会做类似的事情

  final FileList files = request.execute();     
        request.setPageToken(files.getNextPageToken());

如果你没有得到文件,你会在第二行得到一个 NPE。

您应该使用这样的代码保护自己免受该事件的影响

final FileList files = request.execute();     
if (files!=null){
        request.setPageToken(files.getNextPageToken());
}

具体来说,对于您的错误,您需要像这样保护您的代码

if ((e!=null) && (e.getIntent()!=null)) {
   startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
}else if (e!=null){
    e.printStackTrace();
}

【讨论】:

  • 我已经尝试过你的解决方案,但不幸的是我仍然在 startActivityForResult 上得到 NullPointException
  • 嗯,这更像是一个通用的评论。看看我修改后的答案。
  • 您最好在问题中添加自己的答案,然后标记它。
  • 嗨,我向任何可能混淆了我之前发布的答案的人表示歉意,指出我的问题已得到解决。在使用不同的测试设备和模拟器进行广泛测试后,我是不正确的相同的谷歌帐户,它们可以工作,但是当我将应用程序发送到其他测试设备时,它会在 StartActivityForResult(); 上崩溃
  • if ((e!=null) &amp;&amp; (e.getIntent()!=null)) {开头的部分你试过了吗?
【解决方案2】:

我有同样的问题,我发现崩溃是在 getIntent 本身内部。之前在三星note 2上运行良好,但现在失败了。我不知道为什么。 Eclipse 调试器显示 getIntent 中的一些局部变量 o 为空,并且它与 NPE 一起崩溃。

【讨论】:

  • 我解决了这个问题。诀窍是我将 Activity 传递给 GoogleAccountCredential.usingOAuth2 但它需要上下文。一旦我通过 Context 一切正常。
【解决方案3】:

在调试我的代码后,我发现我的应用程序崩溃的原因是因为我试图通过另一个类的上传方法上传文件,这对我来说没问题,因为我运行了脚本的原始版本并且授权该应用程序,因此允许我将文件上传到谷歌,但不能上传到其他任何人。 我的解决方案是在我的第二堂课上回到我的 Google 0Aauth

        Intent data = new Intent();
        data.putExtra("file", filename);

    if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
    } else {
   getParent().setResult(Activity.RESULT_OK, data);
    }
    finish();

还记得在 Google Oauth 页面上获取 Extra 参数

【讨论】:

    【解决方案4】:

    在 GoogleAccountCredential.usingOAuth2 方法的第一个参数中将“this”参数更改为“this.getApplicatinContext()”。

    解决方案发布在这里: Drive SDK for Android AuthIntent is null

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      相关资源
      最近更新 更多