Как устранить ошибку, связанную с интеграцией API Google диска в приложение для Android?

#java #file #google-drive-api

Вопрос:

Это приложение предназначено для загрузки файлов из приложения Android на Google диск. Итак, здесь я использовал api Google диска, для включения api Google диска я создал проект и учетные данные в консоли Google API. При запуске моего приложения я получаю ошибку, приведенную ниже. Как устранить эту ошибку??

Попытка вызвать виртуальный метод » com.google.android.gms.задачи.Задача com.app.appfordrive.Файл DriveServiceHelper.CreateFile(java.lang.Строка)’ по ссылке на нулевой объект в com.app.appfordrive.MainActivity.uploadPdfFile(MainActivity.java:110) в java.lang.reflect.Метод.вызов(Собственный метод)

2021-10-06 17:01:11.259 1763-2037/com.google.android.gms E/GmsClient: не удается подключиться к сервису: com.google.android.gms.аутентификация.ключ.поиск.сервис.НАЧНИТЕ с com.google.android.gms

MainActivity.java

     private static final String TAG = "MainActivity";
    private DriveServiceHelper mDriveServiceHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestSignIn();
    }
    private void requestSignIn() {
        Log.v(TAG,"Requesting sign-in");

        GoogleSignInOptions signInOptions =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .requestScopes(new Scope(DriveScopes.DRIVE_FILE))
                        .build();
        GoogleSignInClient client = GoogleSignIn.getClient(this, signInOptions);

        // The result of the sign-in Intent is handled in onActivityResult.
        startActivityForResult(client.getSignInIntent(), 400);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 400:
                if (resultCode == Activity.RESULT_OK amp;amp; data != null) {
                    handleSignInResult(data);
                }
                break;

        }
    }

    private void handleSignInResult(Intent data) {
        GoogleSignIn.getSignedInAccountFromIntent(data)
                .addOnSuccessListener(new OnSuccessListener<GoogleSignInAccount>() {
                    @Override
                    public void onSuccess(GoogleSignInAccount googleSignInAccount) {
                        // Use the authenticated account to sign in to the Drive service.
                        GoogleAccountCredential credential =
                                GoogleAccountCredential.usingOAuth2(MainActivity.this, Collections.singleton(DriveScopes.DRIVE_FILE));
                        credential.setSelectedAccount(googleSignInAccount.getAccount());



                        Drive googleDriveService =
                                new Drive.Builder(
                                        AndroidHttp.newCompatibleTransport(),
                                        new GsonFactory(),
                                        credential)
                                        .setApplicationName("Drive API Migration")
                                        .build();
                        mDriveServiceHelper = new DriveServiceHelper(googleDriveService);
                    }

                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure (@Nullable Exception e){


                    }
                });
    }



    public void uploadPdfFile(View view){
        ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setTitle("Uploading to Google Drive");
        progressDialog.setMessage("Please wait");
        progressDialog.show();
        String filePath ="C://Users/CABAL/Downloads/certificate.pdf";
        mDriveServiceHelper.createFile(filePath).addOnSuccessListener(new OnSuccessListener<String>() {
            @Override
            public void onSuccess(String s) {
                progressDialog.dismiss();
                Toast.makeText(getApplicationContext(),"Uploaded Successfully",Toast.LENGTH_LONG).show();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                progressDialog.dismiss();
                Toast.makeText(getApplicationContext(),"Check your google drive api",Toast.LENGTH_LONG).show();

            }
        });


    }
}
 

DriveServiceHelper.java

     public class DriveServiceHelper {
     private final Executor mExecutor = Executors.newSingleThreadExecutor();
     private final Drive mDriveService;
     public DriveServiceHelper(Drive mDriveService)
     {
        this.mDriveService = mDriveService;
     }
     public Task<String> createFile(String filePath) {
        return Tasks.call(mExecutor, () -> {
            File fileMetadata = new File();
            fileMetadata.setName("my file");
            java.io.File file = new java.io.File(filePath);
            FileContent metaContent = new FileContent("application/pdf",file);
            File myFile = null;
            try{
                myFile = mDriveService.files().create(fileMetadata,metaContent).execute();
            }catch (Exception e){
                e.printStackTrace();
            }
            if (myFile == null) {
                throw new IOException("Null result when requesting file creation.");
            }

            return myFile.getId();
        });



     }

}
 

build.gradle

     plugins {
      id 'com.android.application'
    }

    android {
      compileSdkVersion 31
      buildToolsVersion "30.0.3"

     defaultConfig {
        applicationId "com.app.appfordrive"
        minSdkVersion 16
        targetSdkVersion 31
        versionCode 1
        versionName "1.0"
        multiDexEnabled true

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        packagingOptions {
            exclude 'META-INF/DEPENDENCIES'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/license.txt'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/notice.txt'
            exclude 'META-INF/ASL2.0'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.multidex:multidex:2.0.1'
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'com.google.android.material:material:1.4.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
    testImplementation 'junit:junit:4. '
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    // g drive libs
    implementation 'com.google.android.gms:play-services-auth:19.2.0'
    implementation 'com.google.http-client:google-http-client-gson:1.26.0'
    implementation('com.google.api-client:google-api-client-android:1.26.0') {
        exclude group: 'org.apache.httpcomponents'
    }
    implementation('com.google.apis:google-api-services-drive:v3-rev136-1.25.0') {
        exclude group: 'org.apache.httpcomponents'
    }
}
 

AndroidManifest.xml

     <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.app.appfordrive">
    <!-- Permissions required by GoogleAuthUtil -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication">
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
 

И возможно ли использовать API Google диска без использования входа в Google/с использованием пути по умолчанию для диска?

Ответ №1:

Причина NullPointerException в том, что вы выполняете mDriveServiceHelper.createFile(filePath) , когда mDriveServiceHelper все еще null .

Предположительно, это означает, что ваш OnSuccessListener<GoogleSignInAccount> не был вызван, потому что именно там вы инициализируетесь mDriveServiceHelper .


И возможно ли использовать API Google Диска без использования входа в Google, используя путь к диску по умолчанию?

Я думаю, что ответ-Нет.

Я предполагаю, что вы говорите о чем-то, что будет «монтировать» Google Диск через файловую систему FUSE или выполнять эквивалент Ubuntu gio mount . Я не думаю, что что-либо из этого доступно на платформах Android. И даже если бы они были доступны, необходимо было бы вводить учетные данные для входа в Google при каждом подключении диска.