当前位置: 首页 > 知识库问答 >
问题:

从Google Drive中列出文件,并在Android中获得所选文件的downloadUrl

解沈义
2023-03-14
public class GoogleDriveActivity extends Activity {

private GoogleApiClient mGoogleApiClient;
public com.google.api.services.drive.Drive mService;
public GoogleAccountCredential credential;
public static final int REQUEST_AUTHORIZATION = 3;
public static final int REQUEST_ACCOUNT_PICKER = 4;

private static final String PREF_ACCOUNT_NAME = "accountName";
private static final String[] SCOPES = {DriveScopes.DRIVE_METADATA_READONLY};
final HttpTransport transport = AndroidHttp.newCompatibleTransport();
final JsonFactory jsonFactory = GsonFactory.getDefaultInstance();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_google_drive);

    SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
    credential = GoogleAccountCredential.usingOAuth2(
            getApplicationContext(), Arrays.asList(SCOPES))
            .setBackOff(new ExponentialBackOff())
            .setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, "abc.test@gmail.com"));

    mService = new com.google.api.services.drive.Drive.Builder(
            transport, jsonFactory, credential)
            .setApplicationName("My Application")
            .build();
}

@Override
public void onResume() {
    super.onResume();
    refreshResults();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case REQUEST_AUTHORIZATION:
            if (resultCode != RESULT_OK) {
                chooseAccount();
            }
            break;
        case REQUEST_ACCOUNT_PICKER:
            Log.w("gd", "in account picker");
            if (resultCode == RESULT_OK && data != null &&
                    data.getExtras() != null) {
                String accountName =
                        data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                if (accountName != null) {
                    credential.setSelectedAccountName(accountName);
                    SharedPreferences settings =
                            getPreferences(Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putString(PREF_ACCOUNT_NAME, accountName);
                    editor.commit();
                }
            } else if (resultCode == RESULT_CANCELED) {
                Log.W("gd", "in cancelled");
            }
            break;

        default:
            super.onActivityResult(requestCode, resultCode, data);
            break;
    }
}

private void chooseAccount() {
    startActivityForResult(
            credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}

private void refreshResults() {
    new GoogleDriveAsync(this).execute();
}

public class GoogleDriveAsync extends AsyncTask<Void, Void, Void> {

    private GoogleDriveActivity activity;

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            getDataFromApi();

        } catch (final GooglePlayServicesAvailabilityIOException availabilityException) {
            Log.w("gd", "GPS unavailable");

        } catch (UserRecoverableAuthIOException userRecoverableException) {
            Log.w("gd", "user recoverable");
            activity.startActivityForResult(
                    userRecoverableException.getIntent(),
                    GoogleDriveActivity.REQUEST_AUTHORIZATION);

        } catch (Exception e) {
            Log.w("gd", "general exception " + e.getMessage());
        }
        return null;
    }

    GoogleDriveAsync(GoogleDriveActivity activity) {
        this.activity = activity;
    }

    /**
     * Fetch a list of up to 10 file names and IDs.
     *
     * @return List of Strings describing files, or an empty list if no files
     * found.
     * @throws IOException
     */
    private List<String> getDataFromApi() throws IOException {
        // Get a list of up to 10 files.
        List<String> fileInfo = new ArrayList<String>();
        FileList result = activity.mService.files().list()
                .setMaxResults(10)
                .execute();
        List<File> files = result.getItems();
        if (files != null) {
            for (File file : files) {
                fileInfo.add(String.format("%s (%s) (%s)\n",
                        file.getTitle(), file.getId(), file.getDownloadUrl()));
            }
        }
        Log.w("gd", "file info is " + fileInfo.toString());
        return fileInfo;

    }
}
}

共有1个答案

韩善
2023-03-14
        DriveId driveId = metadata.getDriveId();
        String resourceId = driveId.getResourceId();
 类似资料:
  • 我正在开发一个Android应用程序,其中一个功能是让用户选择要打开的文件(我想打开一个纯文本的.txt文件)。我以前用Java开发过Android应用程序,但这次我使用的是Kotlin,而且这是我第一次使用Kotlin。 我现在让应用程序显示一个文件选择器,让用户点击他们想要打开的文件。然后我尝试使用File对象打开文件并执行forEachLine循环。但是由于某种原因,它抛出了一个java.i

  • > 假设我有一个导出链接,如下所示:

  • 问题内容: 我如何返回一个包含该文件夹中的所有文件以及子文件夹的文件数组,我的方法仅适用于该文件夹,并且不包括子文件夹。 问题答案: 使用您当前的代码,进行以下调整:

  • 我正在尝试做一个应用程序,与音频文件工作。我必须在应用程序的一部分中导入和合并来自Firebase的音频文件。 下面是来自合并操作的代码块; 问题是下载firebase文件的代码继续工作。正如您所看到的,我试图用无限循环来修复这一点,但Firebase在没有正确加载时创建文件,因此解决方案没有成功。 我试图编写为加入onSuccess事件而创建的数组,但在这种情况下,我将无法完全准备好要使用的数组

  • rank ▲ ✰ vote url 39 502 134 633 url 在Python中列出目录中的所有文件 怎么样用Python列出一个目录的所有文件并且存进一个列表? os.listdir()可以获得一个目录中所有文件或者子目录. 如果你只想要文件的话,你也可以用os.path把其他的过滤掉: from os import listdir from os.path import isfile

  • 我想从SD卡文件路径中获取文件名。e、 g.:/storage/sdcard0/DCIM/Camera/1414240995236。jpg我想得到1414240995236。jpg我已经编写了获取相同内容的代码,但它不起作用。请帮忙<下面是我的代码: