#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 при каждом подключении диска.