Как исправить ошибку "загрузить хранилище файлов на Google Drive" в Android - PullRequest
0 голосов
/ 13 января 2019

Я сделал приложение для загрузки файла PDF из прямой ссылки на внутреннее хранилище. Когда я пытаюсь скачать прямую ссылку с Google Drive, она работает нормально, если размер файла меньше 3 МБ. Но если файл больше 3 МБ, он не загружается. Вот мой код ниже:

public class MainActivity extends AppCompatActivity {
private final  String Pdf_LINK = 
("https://drive.google.com/uc?export=download&id=13mE9gCyTGmLrFOZqu6Lz-yz0mcfjGoJc");
private final String My_PDF ="my100.pdf";
private AppCompatSeekBar seekBar;
private PDFView pdfView;
private TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    pdfView = findViewById(R.id.pdfView);
    txtView = findViewById(R.id.txtView);
    initSeekar();
    downloadpdf(My_PDF);
}
private void initSeekar(){
seekBar = findViewById(R.id.seeBar);
seekBar.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
seekBar.getThumb().setColorFilter(Color.RED,PorterDuff.Mode.SRC_IN);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        int val = (progress * (seekBar.getWidth() - 3 * seekBar.getThumbOffset())) / seekBar.getMax();
        txtView.setText("" + progress);
        txtView.setX(seekBar.getX() + val + seekBar.getThumbOffset() / 2);
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});
}

private void downloadpdf(final String fileName) {
    new AsyncTask<Void, Integer, Boolean>() {
        @Override
        protected Boolean doInBackground(Void... params) {return downloadpdf();}

        @Nullable
        private Boolean downloadpdf() {
            try {
                File file = getFileStreamPath(fileName);
                if (file.exists())
                    return true;
                try {
                    FileOutputStream fileOutputStream = openFileOutput(fileName, Context.MODE_PRIVATE);
                    URL u = new URL(Pdf_LINK);
                    URLConnection conn = u.openConnection();
                    int contentLength = conn.getContentLength();
                    InputStream input = new BufferedInputStream(u.openStream());
                    byte data[] = new byte[contentLength];
                    long total = 0;
                    int count;
                    while ((count = input.read(data)) != -1) {

                        total += count;
                        publishProgress((int) ((total * 100) / contentLength));
                        fileOutputStream.write(data, 0, count);
                    }
                    fileOutputStream.flush();
                    fileOutputStream.close();
                    input.close();
                    return true;
                } catch (final Exception e) {
                    e.printStackTrace();

                    return false;
                    }
                } catch (Exception e) {
                e.printStackTrace();
                    }
                     return false;
                }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            seekBar.setProgress(values[0]);
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            if (aBoolean) {
                openPdf(fileName);
            } else {
                Toast.makeText(MainActivity.this, "Unable to download this file", Toast.LENGTH_SHORT).show();

                }
            }
        }.execute();
    }


    private void openPdf(String fileName) {
    try {
        File file = getFileStreamPath(fileName);
        Log.e("file", "file: " + file.getAbsolutePath());
        seekBar.setVisibility(View.GONE);
        pdfView.setVisibility(View.VISIBLE);
        pdfView.fromFile(file)
                  .enableSwipe(true)
                  .swipeHorizontal(false)
                  .load();
    } catch (Exception e) {
          e.printStackTrace();
          }
    }
}

В чем ошибка в этом коде? Как я могу решить эту проблему?
Если я пытаюсь загрузить файл PDF с другого сайта, он работает хорошо. Но проблема только в том, что при попытке скачать с гугл диска. пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 31 января 2019

Мне удалось загрузить большие общедоступные файлы с Google Drive.

Используйте URL:

https://drive.google.com/uc?id=<FILE_ID>&export=download 

Замените <FILE_ID> на ваш общий идентификатор файла.

Я использовал код в «приватном классе DownloadTask» в этом решении:

Загрузка файла с Android и отображение прогресса в ProgressDialog

Код внутри функции doInBackground работает, я изменил его для своих нужд, вместо этого использовал ProgressBar. Я не публикую свой код, так как он слишком длинный.

Надеюсь, вы сможете решить свою проблему.

...