Android 6.0 - 无需请求权限即可将文件下载到外部存储

时间:2016-10-18 09:07:45

标签: android android-6.0-marshmallow android-permissions

我的设备上有超级用户访问权限。我非常成功地使用这个函数以编程方式下载和更新我的应用程序,但是自从android 6.0以来这个函数停止工作(因为新的权限请求类型)。

我的问题是:由于我在我的root设备上有超级用户访问权限,如何编辑我的功能以便我可以在SD卡上下载外部文件而无需用户的许可?

这是我用来更新应用程序的功能:

public class UpdateAppZ extends AsyncTask<String,Void,Void>{
    private Context context;
    public void setContext(Context contextf){
        context = contextf;
    }

    @Override
    protected Void doInBackground(String... arg0) {
        try {
            URL url = new URL(arg0[0]);
            HttpURLConnection c = (HttpURLConnection) url.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();

            String PATH = "/mnt/sdcard/Download/";
            File file = new File(PATH);
            file.mkdirs();
            File outputFile = new File(file, "update.apk");
            if(outputFile.exists()){
                outputFile.delete();
            }
            FileOutputStream fos = new FileOutputStream(outputFile);

            InputStream is = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len1);
            }
            fos.close();
            is.close();

            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(new File("/mnt/sdcard/Download/update.apk")), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error!
            context.startActivity(intent);


        } catch (Exception e) {
            Log.e("UpdateAPP", "Update error! " + e.getMessage());
        }
        return null;
    }
}

并致电:

UpdateAppZ atualizaApp = new UpdateAppZ();    
                             atualizaApp.setContext(getApplicationContext()); 
                              atualizaApp.execute("http://85.118.98.251/misho/app-debug.apk");

3 个答案:

答案 0 :(得分:2)

下载到getExternalFilesDir()。其他应用有权访问时无需权限。

答案 1 :(得分:1)

不,你不能这样做,因为从Android 6.0你需要在运行时询问危险的权限。

  

因为如果设备运行的是Android 6.0(API级别23)或更高版本,   并且应用程序的targetSdkVersion为23或更高,操作系统将强制执行   该应用程序在运行时从用户请求权限。

您是否拥有root权限的天气。

来源:
https://developer.android.com/guide/topics/security/permissions.html https://developer.android.com/training/permissions/index.html

答案 2 :(得分:0)

https://stackoverflow.com/a/51112708/4650581


如果要在没有任何许可的情况下保存文件,则可以使用getExternalFilesDir。 如文档中所述:

  

getExternalFilesDir

     

添加到API level 8

     

File getExternalFilesDir (String type)

     

返回主目录上目录的绝对路径   可以放置应用程序的共享/外部存储设备   它拥有的永久文件。这些文件是内部文件   应用程序,通常对用户来说是不可见的。

     

这类似于getFilesDir(),因为当   应用程序已卸载,但是有一些重要的   区别:共享存储可能并不总是可用,因为   用户可以弹出可移动媒体。可以检查媒体状态   使用getExternalStorageState(File)。没有强制执行安全性   这些文件。例如,任何持有   WRITE_EXTERNAL_STORAGE可以写入这些文件。

     

如果模拟共享存储设备(由isExternalStorageEmulated(File)确定),   它的内容由私有用户数据分区支持,这意味着   在这里存储数据而不是私有数据几乎没有什么好处   getFilesDir()等返回的目录。

     

从KITKAT开始,不需要任何权限来读取或写入返回的路径;调用应用程序始终可以访问它。这仅适用于为调用应用程序的程序包名称生成的路径。

     

访问路径   属于其他软件包WRITE_EXTERNAL_STORAGE和/或   READ_EXTERNAL_STORAGE是必需的。在具有多个用户的设备上(例如   由UserManager描述),每个用户都有各自独立的共享   存储。应用程序只能访问共享存储   用户以他们的身份运行。

     

如果出现以下情况,返回的路径可能会随时间变化   插入了不同的共享存储介质,因此只有相对路径   应该坚持下去。

https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String)


此链接可能有用:

Save files on device storage