尝试从Android应用程序中下载文件

时间:2011-11-29 13:15:41

标签: android file download

我正在尝试从我的应用程序中下载文件。我已经设置了一个按钮的onClickListener来调用这个方法:

private void downloadFile(String fileUrl, File destDir, String fileName) {
    try {
        URL url = new URL(fileUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setDoOutput(true);
        connection.connect();

        if (destDir.isDirectory() && !destDir.exists()) {
            destDir.mkdirs();
        }

        FileOutputStream output = new FileOutputStream(new File(destDir.toString() + "/" + fileName));

        InputStream input = connection.getInputStream();

        byte[] buffer = new byte[1024];
        int byteCount = 0;

        while ((byteCount = input.read(buffer)) != -1) {
             output.write(buffer, 0, byteCount);
        }

        output.close();
        input.close();
    } catch (IOException e) {
        Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.e("IOException", "Error: " + e.getMessage(), e);
    } finally {
        Toast.makeText(this, "File downloaded: " + fileName, Toast.LENGTH_SHORT).show();
    }
}

我一直在经历各种主题,但似乎没有人提出可用的解决方案。当我使用上面指定的代码时,似乎没有任何事情发生。

编辑:文件将在后台下载并在完成后显示简短的吐司。但是,下载时按钮似乎是“点击”的。有什么想法吗?

感谢您的帮助!

实际上我并不需要所有代码。我只需要使用类似的东西:

private void getFile(String url) {
    try {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.e("ActivityNotFoundException", "Error: " + e.getMessage(), e);
    } catch (NullPointerException e) {
        Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.e("NullPointerException", "Error: " + e.getMessage(), e);
    }
}

这对某些人也有用:

private void openFile(File file) {
    try {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
        intent.addCategory(Intent.CATEGORY_BROWSABLE);
        startActivity(intent);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.e("ActivityNotFoundException", "Error: " + e.getMessage(), e);
    } catch (NullPointerException e) {
        Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
        Log.e("NullPointerException", "Error: " + e.getMessage(), e);
    }
}

1 个答案:

答案 0 :(得分:0)

如果没有任何反应,您应该在代码中添加一些日志记录。

您还可以通过调用Toast.makeText(context, ex.getMessage(), Toast.LENGTH_SHORT).show()

向用户显示错误

最好是使用这样的辅助方法显示根本原因消息:

public static String getRootCauseMessage(Throwable ex) {
    ex = getRootCause(ex);
    String message = ex.getLocalizedMessage();
    return message == null ? ex.getClass().getSimpleName() : message;
}

public static Throwable getRootCause(Throwable ex) {
    Throwable cause = ex.getCause();
    return cause == null ? ex : getRootCause(cause);
}