Android 文件重定向下载 & 通知问题小结

简介: Android 重定向文件下载尝试与通知栏信息提醒!

    小菜之前在 Android 处理文件下载过程中遇到以下几个小问题,小菜简单整理一下;

Download

重定向文件下载如何获取文件类型?

    小菜在下载过程中通常需要获取文件名称和文件类型等进行具体的业务处理;而下载类的链接也不是固定格式的,主要区分为 https://github.com/ace.../test.apk 以及 https://github.com/ace...?app=acetest 等经过重定向之后的下载链接;

    针对第一种类型链接,小菜可以方便的获取文件类型和名称等一系列信息,针对第二种重定向类型链接,小菜尝试了如下几种方式;

方案一:

    小菜尝试通过 BufferedInputStream 获取文件类型,其中调用时需要进行异步操作,而结果并不如意,很多文件类型不能直接识别;

private String getFileType(String path) {
    String type = "";
    BufferedInputStream bufferedInputStream = null;
    HttpURLConnection urlconnection = null;
    try {
        URL url = new URL(path);
        urlconnection = (HttpURLConnection) url.openConnection();
        urlconnection.connect();
        bufferedInputStream = new BufferedInputStream(urlconnection.getInputStream());
        type = HttpURLConnection.guessContentTypeFromStream(bufferedInputStream) + "";
    } catch (IOException e) {
        e.printStackTrace();
    }
    return type;
}

方案二:

    小菜借助 OKHttp 方式将重定向的 URL 转为起始状态 URL,从而获取文件名称,文件类型等;但该方式调用时也需要异步操作,不能在主线程中执行;

private void getRealUrl(String url) {
    if (!Empty.check(url)) {
        try {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url(url).build();
            Response response = client.newCall(request).execute();
            HttpUrl realUrl = response.request().url();
            if (!Empty.check(realUrl) && !Empty.check(realUrl.url())) {
                String temp = realUrl.toString();
                String fileName = temp.substring(temp.lastIndexOf("/") + 1);
                if (fileName.contains("?")) {
                    fileName = fileName.substring(0, fileName.lastIndexOf("?"));
                }
                ...
            }
        } catch (IOException e) {
            Logger.e(TAG, Empty.check(e) ? "" : e.getMessage());
        }
    }
}

方案三:

    在具体特定 WebView 场合,可以通过 WebView 预先加载之后获取起始下载链接,之后在进行具体的业务逻辑操作;

    小菜尝试了多种方式,对于重定向类型下载链接基本都需要异步耗时操作,暂时还未找到更简单快捷的方式;

Notification

    Notification 在日常应用场景非常多,而配合下载类提示用户时小菜遇到几个小问题,简单整理一下;

1. 使用进度条时提示音一直播放?

    小菜测试时,使用进度条 setProgress 时,随着进度的进行提示音一直在提醒,此时可以设置 NotificationCompat.Builder.setOnlyAlertOnce 只提醒一次即可;于此同事,部分手机时间一直在闪动,例如:刚刚 一直在提示,可以通过 setShowWhen 关闭时间戳提示即可;

NotificationCompat.Builder notification =
    new NotificationCompat.Builder(context, notifyId + "").setSmallIcon(R.drawable.icon)
        .setSound(null)
        .setVibrate(null)
        .setContentTitle(title)
        .setContentText(des)
        .setAutoCancel(true)
        .setShowWhen(false)
        .setOnlyAlertOnce(true)
        .setProgress(100, downloadProgress, false);

2. 结束后点击通知栏消息不消失?

    小菜测试在设置点击自动关闭属性 setAutoCancel 后,完成下载,点击通知栏消息时,该 Notification 未消失;其原因在于小菜省略了设置 setContentIntentPendingIntent;即便是不需要跳转安装或其他具体页面,也需要设置一个默认的 PendingIntent

PendingIntent pendingIntent;
if (fileType != null && fileType.equals(FileDownloadManager.FILE_TYPE_APK)) {
    pendingIntent = PendingIntent.getActivity(context, 0, clickIntent, 0);
} else {
    pendingIntent = PendingIntent.getBroadcast(context, REQUESTCODE, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
}

NotificationCompat.Builder notification =
    new NotificationCompat.Builder(context, notifyId + "").setSmallIcon(R.drawable.icon)
        .setContentText(des)
        .setContentIntent(pendingIntent);

3. 如何左右滑动清除通知监听?

    小菜之前未尝试过滑动清除 Notification,实际与设置点击通知操作类似,也需要设置对应的 PendingIntentsetDeleteIntent 即可;

pendingIntent = PendingIntent.getBroadcast(context, REQUESTCODE, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder notification =
    new NotificationCompat.Builder(context, notifyId + "").setSmallIcon(R.drawable.icon)
        .setContentText(des)
        .setDeleteIntent(pendingIntent);

    小菜在测试过程中,学习了很多之前不常用的属性,内容都很简单,小菜不做具体的介绍;主要是对于重定向文件下载的一个小积累;如有错误,请多多指导!

来源: 阿策小和尚
目录
相关文章
|
4天前
|
开发工具 Android开发 git
Windows下载android2.2完整源码(转)
Windows下载android2.2完整源码(转)
21 3
|
4天前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
34 1
|
4天前
|
Shell Android开发
Android系统 init.rc文件详解
Android系统 init.rc文件详解
47 0
|
4天前
|
存储 Java API
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
92 0
|
4天前
|
敏捷开发 Java 机器人
云效产品使用常见问题之打包后的Android应用获取下载地址失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4天前
|
Java Android开发
android 下载图片的问题
android 下载图片的问题
13 3
|
3天前
|
Android开发
Android studio 2021.3.1不生成iml文件
Android studio 2021.3.1不生成iml文件
18 5
|
4天前
|
Android开发
Android stdio 无法新建或打开AIDL文件(解决方法)
Android stdio 无法新建或打开AIDL文件(解决方法)
12 0
|
4天前
|
Android开发
android string.xml文件中的整型和string型代替
android string.xml文件中的整型和string型代替
|
4天前
|
Android开发
android 12 U盘 /mnt/media_rw 下读取文件异常 没有权限
android 12 U盘 /mnt/media_rw 下读取文件异常 没有权限
37 0