老师,我添加了动态获取权限以后,下载的进度条能动,但是SD卡里面却看不到最后下载好的文件

老师,我添加了动态获取权限以后,下载的进度条能动,但是SD卡里面却看不到最后下载好的文件

1、manifest中加入了权限:

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

2、剩下的java代码是这样的,没有任何报错

package com.xinshuiji.handlerproject;

import android.Manifest;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;


public class DownloadActivity extends FragmentActivity {
    private static final String TAG = "DownloadActivity";
    public static final int DOWNLOAD_MESSAGE_CODE = 100001;
    private static final int DOWNLOAD_MESSAGE_FAIL_CODE = 100002;
    public static final String APP_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk";
    public static final int MY_REQUEST_CODE = 666;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download);

        final ProgressBar progressBar = findViewById(R.id.progressBar);

        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 点击后先检查权限,使用boolean值标记是否有权限
                Boolean aBoolean = isAllPermissionGrant(new String[]{
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
                });

                if (aBoolean) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            download(APP_URL);
                        }
                    }).start();
                    return;
                }

                // 到此处时表明没有权限,这需要申请权限
                ActivityCompat.requestPermissions(
                        DownloadActivity.this,
                        new String[]{
                                Manifest.permission.READ_EXTERNAL_STORAGE,
                                Manifest.permission.WRITE_EXTERNAL_STORAGE
                        },
                        MY_REQUEST_CODE
                );
            }
        });

        handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);

                switch (msg.what){
                    case DOWNLOAD_MESSAGE_CODE:
                        progressBar.setProgress((Integer) msg.obj);
                        break;
                    case DOWNLOAD_MESSAGE_FAIL_CODE:
                        Log.i(TAG, "handleMessage: fail");
                        break;
                }
            }
        };
    }

    /**
     * 检查是否有权限的方法
     * @param permissions 是需要检测权限的权限数组
     * @return 返回是否有全部权限
     */
    private Boolean isAllPermissionGrant(String[] permissions){
        for (String permission:permissions) {
            if (ContextCompat.checkSelfPermission(DownloadActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    private void download(String appUrl) {
        try {
            URL url = new URL(appUrl);
            URLConnection urlConnection = url.openConnection();

            InputStream inputStream = urlConnection.getInputStream();

            /*
            * 获取文件的总长度
            * */
            int contentLength = urlConnection.getContentLength();

            // 放在SD卡的下面的imooc这个目录下面
            String downloadFolderName = Environment.getExternalStorageDirectory() + File.separator + "imooc" + File.separator;

            File file = new File(downloadFolderName);

            if (!file.exists()) {
                file.mkdir();
            }

            String fileName = downloadFolderName + "imooc.apk";

            File apkFile = new File(fileName);

            if (apkFile.exists()) {
                apkFile.delete();
            }

            // 下载的长度,他和总长度的比值就是progress
            int downloadSize = 0;
            byte[] bytes = new byte[1024];

            int length;

            OutputStream outputStream = new FileOutputStream(fileName);
            while ((length = inputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, length);
                downloadSize += length;
                /*
                * update UI
                * */
                Message message = Message.obtain();
                message.obj = downloadSize * 100 / contentLength;
                message.what = DOWNLOAD_MESSAGE_CODE;
                // 此时需要一个handler去sendMessage
                handler.sendMessage(message);
            }
            inputStream.close();
            outputStream.close();

        } catch (MalformedURLException e) {
            Message message = Message.obtain();
            message.what = DOWNLOAD_MESSAGE_FAIL_CODE;
            handler.sendMessage(message);
            e.printStackTrace();
        } catch (IOException e) {
            Message message = Message.obtain();
            message.what = DOWNLOAD_MESSAGE_FAIL_CODE;
            handler.sendMessage(message);
            e.printStackTrace();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == MY_REQUEST_CODE) {
            boolean isAllGrant = true;
            for (int grantResult : grantResults) {
                if (grantResult != PackageManager.PERMISSION_GRANTED) {
                    isAllGrant = false;
                    break;
                }
            }

            if (isAllGrant) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        download(APP_URL);
                    }
                }).start();
            }else {
                //弹出对话框告诉用户需要权限的原因,并引导用去去应用管理权限中手动打开权限按钮
                openAppDetails();
            }
        }
    }

    /*
    打开App的详情设置
     */
    private void openAppDetails() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("备份通讯录需要访问 “通讯录” 和 “外部存储器” , “请到 应用信息 -> 权限” 中授予!");
        builder.setPositiveButton("去手动授权", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.setData(Uri.parse("package:"+getPackageName()));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                startActivity(intent);
            }
        });
        builder.setNegativeButton("取消",null);
        builder.show();
    }
}


正在回答

登陆购买课程后可参与讨论,去登陆

4回答

你打开这个/storage/emulated/0/目录看有没有

http://img1.sycdn.imooc.com//climg/5b5551a90001eb6c05050158.jpg

  • 慕妹1843335 提问者 #1
    老师打不开,空的~~
    2018-07-23 11:58:11
  • irista23 回复 提问者 慕妹1843335 #2
    如果/storage/emulated/0/ 打不开,需要配置adb环境变量,配置好后直接输入adb root,重启模拟器。
    2018-07-23 12:05:20
提问者 慕妹1843335 2018-07-23 09:45:51
  • 你在DDMS中的File Explorer按照指定sdCard目录去找下载文件。
    2018-07-23 11:12:11
  • 提问者 慕妹1843335 回复 irista23 #2
    额···,还是没有~~~~我提交截图··
    2018-07-23 11:52:21
irista23 2018-07-23 09:33:09

你运行的是模拟器还是手机设备?你说的看不到具体的是DDMS中File Explorer为空吗?

  • 提问者 慕妹1843335 #1
    模拟器运行的,但是模拟器里面我看了有卡,我能正常的保存图片到模拟器里面去呢
    2018-07-23 09:35:13
  • irista23 回复 提问者 慕妹1843335 #2
    就看不到下载文件还是文件目录打不开?
    2018-07-23 09:39:32
  • 提问者 慕妹1843335 回复 irista23 #3
    看不到下载的文件呢,然后自定义的那个imooc的目录也没有,我在后面贴图你看
    2018-07-23 09:44:22
提问者 慕妹1843335 2018-07-23 09:12:06

原文中没有这么大段的注释,不知道为什么贴出来以后这么多注释~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Android网络操作与数据存储2018版
  • 参与学习           人
  • 提交作业       307    份
  • 解答问题       1613    个

本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师