如何将Uri列表中的图片上传到Google Drive?

问题描述 投票:0回答:1

我从本地存储显示图像到recyclerview,现在我想从本地文件夹上传图像到google drive.我有一个图像的Uri.I有登录代码的google drive,但我不知道如何从android上传图像到google drive.有。我有一个列表的Uri的图像.我有登录代码的谷歌驱动器,但我不知道如何上传图像从Android到谷歌驱动器.有一个按钮,我点击按钮,它将开始上传所有的图像从列表的Uri到谷歌驱动器。请帮助实现这一点.谢谢你。

首页碎片

package com.example.infilect.ui.home;

import android.content.ClipData;
import android.content.Intent;
import android.hardware.Camera;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.Adapter;

import com.example.infilect.Adapter.PicAdapters;
import com.example.infilect.Models.Items;
import com.example.infilect.R;
import com.google.android.gms.auth.api.credentials.Credential;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.Scopes;
import com.google.android.gms.common.api.Scope;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static android.content.ContentValues.TAG;

public class HomeFragment extends Fragment {

private HomeViewModel homeViewModel;

RecyclerView recyclerView;
List<Items> itemsList;
PicAdapters picAdapters;
Button syncBtn;


public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    homeViewModel =
            ViewModelProviders.of(this).get(HomeViewModel.class);
    View root = inflater.inflate(R.layout.fragment_home, container, false);

    itemsList = new ArrayList<>();

    syncBtn = root.findViewById(R.id.syncBtn);

    loadUriData();

    recyclerView = root.findViewById(R.id.home_recycler);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    PicAdapters picAdapters = new PicAdapters(itemsList,getContext());
    recyclerView.setAdapter(picAdapters);

    syncBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

    return root;
}

private void loadUriData() {

    File file = new File(Environment.getExternalStorageDirectory()+"/InfilectPics/");

    if(file != null) {

        File listFile[] = file.listFiles();

        for (int i = 0; i < listFile.length; i++) {

            Items items = new Items(Uri.fromFile(listFile[i]), false);
            itemsList.add(items);
        }
    }
}

public  void requestSignIn()
{
    GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestScopes(new Scope(Scopes.PLUS_LOGIN), new Scope(Scopes.PLUS_ME))
            .build();

    GoogleSignInClient googleSignInClient = GoogleSignIn.getClient(getContext(),googleSignInOptions);

    startActivityForResult(googleSignInClient.getSignInIntent(),1000);
}

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 1000)
    {
        handleSignInIntent(data);
    }
}

private void handleSignInIntent(Intent data) {

    GoogleSignIn.getSignedInAccountFromIntent(data).addOnSuccessListener(new OnSuccessListener<GoogleSignInAccount>() {
        @Override
        public void onSuccess(GoogleSignInAccount googleSignInAccount) {
            GoogleAccountCredential accountCredential = GoogleAccountCredential
                    .usingOAuth2(getContext(), Collections.singleton(Scopes.DRIVE_FILE));

          accountCredential.setSelectedAccount(googleSignInAccount.getAccount());
          Drive googleDriveServices = new Drive.Builder(
                  AndroidHttp.newCompatibleTransport(),
                  new GsonFactory(),
                  accountCredential)
                  .setApplicationName("My Pictures")
                  .build();

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

        }
    });
}

}

build.gradle

 apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    defaultConfig {
        applicationId "com.example.infilect"
        minSdkVersion 22
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    def camerax_version = '1.0.0-alpha06'
    //noinspection GradleDependency
    implementation "androidx.camera:camera-core:${camerax_version}"
    //noinspection GradleDependency
    implementation "androidx.camera:camera-camera2:${camerax_version}"

    implementation 'com.squareup.picasso:picasso:2.71828'

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.navigation:navigation-fragment:2.2.2'
    implementation 'androidx.navigation:navigation-ui:2.2.2'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

    //goole drive
    implementation('com.google.apis:google-api-services-drive:v3-rev136-1.25.0') {
        exclude group: 'org.apache.httpcomponents'
    }
    implementation 'com.google.android.gms:play-services-auth:18.0.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'
    }

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
java android google-drive-android-api
1个回答
1
投票

如果你想写可移植的代码,学习如何复制文件,使用 文档文件 代替。这样你的代码就可以用 "上传到google drive","上传到本地连接的usb-stick "或者 "上传到sd-card"。

  • 让用户选择一个google-drive-destination文件夹。
  • 使用activity.getContentresolver() openInputStream和openOutputStream复制内容。
© www.soinside.com 2019 - 2024. All rights reserved.