【问题标题】:Download file from Google Drive with its URI, without Google Drive API in Android从 Google Drive 下载文件及其 URI,在 Android 中没有 Google Drive API
【发布时间】:2017-09-07 19:02:31
【问题描述】:

我根本不希望客户进行任何身份验证,例如登录他的电子邮件或其他任何东西。客户端必须在点击时获取所有共享文件。

很多地方都给出了,它可以通过 HTTP GET 来完成。我在 Google Drive 中尝试过使用不同类型的文件和大小,但我的代码给了我大约 50 kb 的文件,这当然是不可读的。

这里举个例子:

  1. 源文件是“Poocha.mp3”。

  2. 我有 Google 返回的此文件的可共享 ID。

  3. 我已验证此 ID 即可共享字符串是可共享的。

  4. 我已获取 Android 清单中的所有权限。

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  5. 我正在现场设备上而不是在模拟器上进行测试。

  6. 当我复制粘贴此链接“https://drive.google.com/uc?export=download&id=0B5Isk4aTJApuZE9sVzg2MUxvc0U”时, 文件已正确下载到浏览器中。

  7. 但我下面的代码不适用于任何驱动器链接。
    但是但是但是

  8. 当我在我的服务器上上传相同的文件并更改 URL 时,该文件会使用以下相同的代码正确下载。我已经对“pictures.jpg”文件进行了同样的尝试,但是 Google Drive 上的每个文件都提供了 50 到 54 kb 的不完整文件,并且相同的代码适用于我服务器上的同一个文件。

我的代码:

protected String doInBackground(String... f_url) {
    int count;
    String id = "0B5Isk4aTJApuZE9sVzg2MUxvc0U";

    try {

        URL url = new URL("https://drive.google.com/uc?export=download&id=" + id);

        HttpURLConnection c = (HttpURLConnection) url.openConnection();

        c.setRequestMethod("GET");

        c.connect();

        int lenghtOfFile = c.getContentLength();

        InputStream input = new BufferedInputStream(url.openStream(), 8192);

        String out = Environment.getExternalStorageDirectory().getAbsolutePath() + "/sifr/album";

        File filedir = new File(out);
        if (!filedir.exists()) {
            filedir.mkdirs();
        }
        OutputStream output = new FileOutputStream(out + "/Poocha.mp3");

        byte data[] = new byte[1024];

        long total = 0;

        while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress("" + (int) ((total * 100) / lenghtOfFile));
            output.write(data, 0, count);
        }

        output.flush();

        output.close();
        input.close();

    } catch (Exception e) {
        Log.i("GetPathLst errr", e + "");
    }
    return null;
}

谁能指出问题所在?

【问题讨论】:

    标签: java android download google-drive-api uri


    【解决方案1】:

    我已经在我的云端硬盘帐户中使用共享文件尝试了您的代码,并且它可以下载文件。我从 Google Drive 获得的共享 URL 格式为:

    https://drive.google.com/open?id=UUjBUTaQyakU0B0HGOaFKlT5geXN
    

    除此之外,您的代码无需修改即可工作。 (顺便说一句,这不是真实身份)。

    我希望这会有所帮助。


    更新

    上述答案虽然正确,但不是您的问题。我刚刚在安装了 Google Drive 的 Android 设备上尝试了您的 URL,Drive 告诉我所有者已“删除”该文件。当我在浏览器中尝试相同的网址时,它下载正常。

    显然,该文件可供下载,但云端硬盘应用似乎会进行额外检查以确保该文件未被丢弃。浏览器不会也不能进行同样的检查。

    将您的文件从垃圾箱中移出或尝试其他文件。它应该可以工作。

    【讨论】:

    • 你解释了什么? @Cheticamp
    • 那不是真实身份是什么意思? @Cheticamp 右键单击​​链接并在新窗口中打开它,文件将被下载。这在我的代码中不起作用。我只有在下载驱动器共享链接时遇到问题。或代码有效。这就是我的问题所关注的地方。如果您能详细说明,那就太好了。我已经添加了我的清单权限。
    • @masoomnazirsanadi 抱歉,我说的不是很清楚。我只是说我在回答中给出的 id 不是我文件的真实 id。我想我找到了你的问题。我会尽快更新我的答案。
    • 感谢您的努力。我开始知道出了什么问题。稍后我会解释得更清楚。
    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多