startActivityForResult上的NullPointException(e.getIntent(),REQUEST_AUTHORIZATION);

时间:2013-03-26 20:14:00

标签: java android google-drive-api

所以我正在使用Google云端硬盘QuickStart教程帮助我了解与Google云端硬盘进行互动的基本知识,而且代码在运行Android 2.3.6的Samsung Ace 2上运行良好,因此我能够 将文件上传到我的Google云端硬盘空间 我的问题是,当我在运行Android 4.2.2的Samsung 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();

  }

有没有人对可能造成这种情况的原因有任何想法?

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

提前感谢您的帮助。

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

调试我的代码后,我发现我的应用程序崩溃的原因是因为我试图通过上传方法从另一个类上传文件,这对我来说是好的,因为我运行了脚本的原始版本授权应用程序,因此允许我上传文件到谷歌,而不是其他任何人。 我的解决方案是在我的第二堂课中回到我的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参数

答案 3 :(得分:0)

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

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