0

そこで、Googleドライブのクイックスタートチュートリアルを使用して、Googleドライブの操作の基本を理解し、Android2.3.6を実行しているSamsungAce 2でコードが正常に機能するため、Googleドライブスペースにファイルをアップロードできます。私の問題は、Android4.2.2を実行しているSamsungSIIで同じアプリケーションを実行すると、アカウントが検出され、アップロード用の新しいファイルを作成できるようになりますが、次の場合にクラッシュします。

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

4 に答える 4

1

あなたは次のようなことをします

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

結果としてファイルを取得しない場合、2行目に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();
}
于 2013-03-26T22:48:01.237 に答える
0

同じ問題があり、クラッシュがgetIntent自体の内部にあることを発見しました。以前はsamsungnote2で正常に機能していましたが、現在は失敗しています。そして、私は理由がわかりません。Eclipseデバッガーは、getIntent内の一部のローカル変数oがnullであり、NPEでクラッシュすることを示しています。

于 2013-03-28T16:08:00.627 に答える
0

コードをデバッグした後、アプリケーションがクラッシュした理由は、別のクラスからアップロードメソッドを使用してファイルをアップロードしようとしたためであることがわかりました。これは、元のバージョンのスクリプトを実行し、アプリケーションを承認したため、問題ありませんでした。したがって、ファイルをGoogleにアップロードできますが、他の人にはアップロードできません。私の解決策は、私のGoogle0Aauthに戻る私の2番目のクラスにありました

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

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

また、GoogleOauthページで追加パラメータを取得することを忘れないでください

于 2013-04-02T00:48:10.263 に答える
0

GoogleAccountCredential.usingOAuth2メソッドの最初の引数の「this」引数を「this.getApplicatinContext()」に変更します。

解決策はここに投稿されました: AndroidAuthIntentのドライブSDKはnullです

于 2013-10-06T18:21:21.727 に答える