从Android驱动器下载带有URI的文件,而不使用Android中的Google Drive API

时间:2017-09-06 17:00:40

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

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

在很多地方都可以通过HTTP GET完成它。我在Google云端硬盘中尝试过不同类型的文件和大小,但是我的代码给了我大约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文件,相同的代码适用于我服务器上的同一文件。

  9. 我的代码:

    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;
    }
    

    有人可以指出问题吗?

1 个答案:

答案 0 :(得分:0)

我已经在我的云端硬盘帐户上使用共享文件尝试了您的代码,并将文件下载确定。我从Google云端硬盘获得的共享网址格式为:

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

除此之外,您的代码无需修改即可运行。 (顺便说一下,那不是真正的身份)。

我希望这会有所帮助。

<强>更新

上述答案虽然属实,但不是你的问题。我刚刚在安装了Google云端硬盘的Android设备上尝试了您的网址,而云端硬盘告诉我,所有者已经&#34;删除&#34;文件。当我在浏览器中尝试使用相同的URL时,它下载了OK。

显然,该文件可供下载,但Drive应用程序似乎进行了额外检查以确保文件未被删除。浏览器没有,也无法进行同样的检查。

从垃圾箱中移动文件或尝试使用其他文件。它应该工作。