精华内容
下载资源
问答
  • //下载apk程序代码protected File downLoadFile(String httpUrl) {// TODO Auto-generated method stubfinal String fileName = "updata.apk";File tmpFile = new File("/sdcard/update");if (!tmpFile.exists()) {...

    //下载apk程序代码

    protected File downLoadFile(String httpUrl) {

    // TODO Auto-generated method stub

    final String fileName = "updata.apk";

    File tmpFile = new File("/sdcard/update");

    if (!tmpFile.exists()) {

    tmpFile.mkdir();

    }

    final File file = new File("/sdcard/update/" + fileName);

    try {

    URL url = new URL(httpUrl);

    try {

    HttpURLConnection conn = (HttpURLConnection) url

    .openConnection();

    InputStream is = conn.getInputStream();

    FileOutputStream fos = new FileOutputStream(file);

    byte[] buf = new byte[256];

    conn.connect();

    double count = 0;

    if (conn.getResponseCode() >= 400) {

    Toast.makeText(Main.this, "连接超时", Toast.LENGTH_SHORT)

    .show();

    } else {

    while (count <= 100) {

    if (is != null) {

    int numRead = is.read(buf);

    if (numRead <= 0) {

    break;

    } else {

    fos.write(buf, 0, numRead);

    }

    } else {

    break;

    }

    }

    }

    conn.disconnect();

    fos.close();

    is.close();

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    } catch (MalformedURLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return file;

    }

    //打开APK程序代码

    private void openFile(File file) {

    // TODO Auto-generated method stub

    Log.e("OpenFile", file.getName());

    Intent intent = new Intent();

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    intent.setAction(android.content.Intent.ACTION_VIEW);

    intent.setDataAndType(Uri.fromFile(file),

    "application/vnd.android.package-archive");

    startActivity(intent);

    }

    展开全文
  • 注意事项:6.0及以下用context...安装都会报Apk文件不正确,无法正常打开;7.0及以上没有问题。installApkO(8.0 需要判断是否允许了安装未知来源应用的权限)private void installApkO(Context context, String downl...

    注意事项:

    6.0及以下用context.getFilesDir().getPath()或者context.getCacheDir().getPath();安装都会报Apk文件不正确,无法正常打开;

    7.0及以上没有问题。

    installApkO(8.0 需要判断是否允许了安装未知来源应用的权限)

    private void installApkO(Context context, String downloadApkPath) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

    //是否有安装位置来源的权限

    boolean haveInstallPermission = getPackageManager().canRequestPackageInstalls();

    if (haveInstallPermission) {

    KLog.i("8.0手机已经拥有安装未知来源应用的权限,直接安装!");

    installApk(context, downloadApkPath);

    } else {

    final AlertDialog.Builder normalDialog = new AlertDialog.Builder(MainActivity.this);

    normalDialog.setTitle("权限申请");

    normalDialog.setMessage("安装应用需要打开安装未知来源应用权限,请去设置中开启权限!");

    normalDialog.setPositiveButton("去设置",

    new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    dialog.dismiss();

    Uri packageUri = Uri.parse("package:" + getPackageName());

    Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageUri);

    startActivityForResult(intent, 10086);

    }

    });

    normalDialog.setNegativeButton("取消",

    new DialogInterface.OnClickListener() {

    @Override

    public void onClick(DialogInterface dialog, int which) {

    dialog.dismiss();

    }

    });

    normalDialog.show();

    }

    } else {

    // 8.0 以下

    installApk(context, downloadApkPath);

    }

    }

    installApk(7.0 及以上和6.0 及以下安装差异)

    public void installApk(Context context, String downloadApk) {

    File file = new File(downloadApk);

    if (!file.exists()) {

    ToastUtils.showLong("安装包不存在!");

    return;

    }

    Intent intent = new Intent(Intent.ACTION_VIEW);

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    String type = getMimeType(file);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

    //7.0 及以上

    Uri apkUri = FileProvider.getUriForFile(context, getPackageName() + ".provider", file);

    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    intent.setDataAndType(apkUri, type);

    } else {

    //6.0 及以下

    Uri uri = Uri.fromFile(file);

    intent.setDataAndType(uri, type);

    }

    context.startActivity(intent);

    }

    getMimeType

    private static String getSuffix(File file) {

    if (file == null || !file.exists() || file.isDirectory()) {

    return null;

    }

    String fileName = file.getName();

    if (fileName.equals("") || fileName.endsWith(".")) {

    return null;

    }

    int index = fileName.lastIndexOf(".");

    if (index != -1) {

    return fileName.substring(index + 1).toLowerCase(Locale.US);

    } else {

    return null;

    }

    }

    public static String getMimeType(File file) {

    String suffix = getSuffix(file);

    if (suffix == null) {

    return "file/*";

    }

    String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(suffix);

    if (type != null || !type.isEmpty()) {

    return type;

    }

    return "file/*";

    }

    onActivityResult

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 10086) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

    boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();

    //再次执行安装流程,包含权限判等

    if (hasInstallPermission && !TextUtils.isEmpty(apkFilePath)) {

    //再次启动安装流程

    installApkO(MainActivity.this, apkFilePath);

    }

    }

    }

    }

    getDiskCacheDir(6.0及以下用context.getFilesDir().getPath()或者context.getCacheDir().getPath();安装都会报包解析错误;)

    public String getDiskCacheDir(Context context) {

    String cachePath = null;

    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())

    || !Environment.isExternalStorageRemovable()) {

    // 不需要动态获取读写权限

    cachePath = context.getExternalCacheDir().getPath();

    } else {

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {

    ApkUtil .checkApkExist(this, getPackageName());

    return null;

    }

    // 不需要动态获取读写权限

    cachePath = context.getCacheDir().getPath();

    }

    return cachePath;

    }

    ApkUtil

    public class ApkUtil {

    /**

    * 应用市场包名

    */

    private static final String[] PACKAGENAME = {

    "com.tencent.android.qqdownloader", "com.qihoo.appstore", "com.baidu.appsearch", "com.xiaomi.market", "com.huawei.appmarket", "com.bbk.appstore",

    "com.meizu.mstore", "com.wandoujia.phoenix2", "com.oppo.market", "cn.goapk.market", "com.android.vending", "com.lenovo.leos.appstore", "com.mappn.gfan"

    };

    public static boolean checkApkExist(Context context, String appPkg) {

    try {

    for (String packageName : PACKAGENAME) {

    if (isAvilible(context, packageName)) {

    launchAppDetail(context, appPkg, packageName);

    return true;

    }

    }

    } catch (RuntimeException e) {

    e.printStackTrace();

    }

    return false;

    }

    /**

    * 判断是否安装了某应用

    *

    * @param context

    * @param packageName

    * @return

    */

    private static boolean isAvilible(Context context, String packageName) {

    final PackageManager packageManager = context.getPackageManager();

    List pinfo = packageManager.getInstalledPackages(0);

    List pName = new ArrayList();

    if (pinfo != null) {

    for (int i = 0; i < pinfo.size(); i++) {

    String pn = pinfo.get(i).packageName;

    pName.add(pn);

    }

    }

    return pName.contains(packageName);

    }

    /**

    * 启动到应用商店app详情界面

    */

    private static void launchAppDetail(Context context, String appPkg, String marketPkg) {

    try {

    if (TextUtils.isEmpty(appPkg)) {

    return;

    }

    Uri uri = Uri.parse("market://details?id=" + appPkg);

    Intent intent = new Intent(Intent.ACTION_VIEW, uri);

    if (!TextUtils.isEmpty(marketPkg)) {

    intent.setPackage(marketPkg);

    }

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    context.startActivity(intent);

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    推荐文章 :

    展开全文
  • 我使用的代码如下Android下载的.apk文件损坏private String downloadFile(String sourceURL, String destinationPath){try {URL url = new URL(sourceURL);URLConnection connection = url.openConnection...

    我需要通过程序下载.apk文件,然后启动其活动。 我使用的代码如下Android下载的.apk文件损坏

    private String downloadFile(String sourceURL, String destinationPath)

    {

    try {

    URL url = new URL(sourceURL);

    URLConnection connection = url.openConnection();

    connection.connect();

    // download the file

    InputStream input = new BufferedInputStream(url.openStream());

    OutputStream output = new FileOutputStream(destinationPath);

    byte data[] = new byte[1024];

    int count;

    while ((count = input.read(data)) > 0) {

    output.write(data, 0, count);

    }

    output.flush();

    output.close();

    input.close();

    //此编辑:使文件RW,否则apk文件将不被安装 调用Runtime.getRuntime()EXEC( “搭配chmod 666” +的DestinationPath) ;

    message = "OK";

    }

    catch (MalformedURLException e) {

    message = "Malformed URL error: " + e.getMessage();

    }

    catch (ProtocolException e) {

    message = "Protocol exception error: " + e.getMessage();

    }

    catch (FileNotFoundException e) {

    message = "File not found error: " + e.getMessage();

    }

    catch (IOException e) {

    e.printStackTrace();

    message = "Failed to download the file : " + e.getMessage();

    }

    return message;

    }

    我提到我先为文本文件调用方法,然后再调用apk文件。因此,每次我在本地处理文件时,我都知道发生了什么问题。通过这种方式,我知道文本文件已正确下载。但.apk文件已损坏。因为我在本地开发,可以访问DDMS和本地主机(IP:10.0.2.2),所以我可以坚信罪魁祸首就是上面的代码。当我通过DDMS与原始.apk文件人为地替换“下载”文件时,所有后续处理都是OK。另外,当我比较原始文件和下载的.apk文件时,我遇到了不同之处。 我在做什么错? 谢谢 PS:搜索,我意识到,虽然是一个流行的问题,但没有一致的答案。就我而言,我将其确定为纯粹的下载方法问题。

    +0

    服务器是否将APK作为二进制文件发送? Content-Type标头的值是什么? –

    +0

    有趣。你建议setRequestProperty为二进制?如果是这样,什么是正确的参数(因为它似乎是相当面向应用程序的格式)。就像connection.setRequestProperty(“content-type”,“multipart/form-data”)? –

    +0

    sourceURL的类型是什么?它是一个HTTP请求?你从哪里下载文件?您将不得不在服务器代码中设置Content-Type标头。 –

    展开全文
  • 由于7.0上面添加了对文件访问的限制,所以需要额外兼容。Android 7.0强制启用了被称作 StrictMode的策略,带来的影响就是你的App对外无法暴露file://类型的URI了。如果你使用Intent携带这样的URI去打开外部App(比如...

    由于7.0上面添加了对文件访问的限制,所以需要额外兼容。Android 7.0强制启用了被称作 StrictMode的策略,带来的影响就是你的App对外无法暴露file://类型的URI了。

    如果你使用Intent携带这样的URI去打开外部App(比如:打开系统相机拍照),那么会抛出FileUriExposedException异常。

    官方给出解决这个问题的方案,就是使用FileProvider:

    0b0ce5d4223a

    Paste_Image.png

    一、 manifest.xml中的application节点下面添加配置

    android:name="android.support.v4.content.FileProvider"

    android:authorities="com.betiger.fileprovider"

    android:grantUriPermissions="true"

    android:exported="false">

    android:name="android.support.FILE_PROVIDER_PATHS"

    android:resource="@xml/file_paths" />

    二、res目录下新建xml目录,添加file_paths.xml文件

    name="download"

    path="Driver" />

    说明:

    name:一个引用字符串。

    path:文件夹“相对路径”,完整路径取决于当前的标签类型。

    相当于Context.getFilesDir() + /path/。

    物理路径相当于Context.getCacheDir() + /path/。

    物理路径相当于Environment.getExternalStorageDirectory() + /path/。

    物理路径相当于Context.getExternalFilesDir(String) + /path/。

    物理路径相当于Context.getExternalCacheDir() + /path/。

    三、安装apk时调用

    /**

    * 安装apk

    */

    private void installSoft() {

    File file = new File(Config.PathConfig.downloadFile() ,"driver.apk");

    Intent intent = new Intent(Intent.ACTION_VIEW);

    // 由于没有在Activity环境下启动Activity,设置下面的标签

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    if(Build.VERSION.SDK_INT>=24) { //判读版本是否在7.0以上

    //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件

    Uri apkUri = FileProvider.getUriForFile(mContext, "com.betiger.fileprovider", file);

    //添加这一句表示对目标应用临时授权该Uri所代表的文件

    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    intent.setDataAndType(apkUri, "application/vnd.android.package-archive");

    }else{

    intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");

    }

    mContext.startActivity(intent);

    }

    展开全文
  • 我需要通过程序下载一个.apk文件然后启动它的活动。我使用的代码如下private String downloadFile(String sourceURL, String destinationPath){try {URL url = new URL(sourceURL);URLConnection connection = url....
  • Android 解压APK文件

    2021-06-06 07:05:36
    最近一个项目里需要得到Android已安装程序的签名文件(CERT.RSA)的SHA1值,所以就调研解压APK文件。通过包名来得到已安装程序在系统的安装包路径。privatestaticStringgetApkPath(StringpkgName){PackageManagerpm=...
  • 我担心的是,这些未使用的图像会包含在apk文件中吗? 由于它们很多,因此增加了apk文件的大小。根目录(包括自定义子目录)中存储的文件不包含在APK中。在项目根目录中拥有项目所需的文件是非常普遍的做法。例如,源...
  • 我们知道安卓手机软件程序均为APK格式文件,很多小白朋友对于安卓...对于多数没有Wifi的手机用户多数则电脑上下载安卓软件,然后复制到手机中再安装,这里就会涉及到如何安装apk文件的问题,下面一起来看看。APK是An...
  • Android 判断File是否为apk文件public static Boolean isApkFile(Context context, String filePath) {String pkg;try {PackageManager packageManager = context.getPackageManager();PackageInfo info = ...
  • 首先,要利用Android SDK 自带的kdytool生成keystore文件:keytool -genkey -alias android.keystore -keyalg RSA -validity 100000 -keystore android.keystore参数意义:-validity主要是证书的有效期,写100000天...
  • 对于不少的Android的用户来说,现在刷机可能是家常便饭了。在刷机的过程中,就会发现一些问题,Android之前所有的...其实解决这个问题的办法也简单,连接网络下载一个文件管理器。其实最大的讽刺是,一台崭新的And...
  • APK文件结构详解

    2021-06-05 15:37:32
    前言最近有业务需求,需要向已经打包的APK里面注入渠道(channel)信息,方便APK下载安装之后进行...必须要对APK文件的结构了如指掌。因此,本文的目的就是以一个简单的利用walle向APK里面注入渠道号为例。带你了解...
  • apk文件怎么安装?如何安装apk文件

    千次阅读 2021-06-05 07:42:16
    可能很多已经入手或者将要入手的机友,对Android系统软件如何安装和卸载比较模糊,我们有必要对之有一个系统的...注:浏览器或下载工具有可能把的下载apk文件后缀名改为.zip,如果碰到这种情况将文件重命名为.apk...
  • 监控DownloadManager,文件下载完成时以文件路径的形式发送intent:// install workIntent install = new Intent(Intent.ACTION_VIEW);install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);String filePath...
  • 在目录入口新建.htaccess需要注意的是,这里添加的是限制文件后缀,就是说要禁止某些文件不被下载,例如.exe等内容为://添加想要限制的文件后缀Order allow,denydeny from all新建下载控制器文件内容为:header(...
  • android studio生成apk方法如下:1、打开AndroidStudio,并且打开想要生成apk文件的项目。点击工具栏上面的“Builder”,点击“Builder”之后在下拉菜单里面可以看到“Genarate Singed APK”,点击这...
  • Android Studio如何导出apk文件

    千次阅读 多人点赞 2021-05-30 11:21:47
    这时候,我们就需要导出apk文件,其实就是安装包,然后在手机端直接安装就行了。下面教大家如何导出apk文件。 1、打开你需要导出的项目,选择Build——>Build Bundle(s)/APK(s)——>Build APK(s) 2、然后等待...
  • apk安装包文件管理app让你可快捷的管理手机里有意或无意下载的各种安装包。软件介绍apk安装包文件管理app是一款非常好用的手机在线文件管理工具,apk安装包文件管理app快速在线为大家带来了优质的文件管理,apk...
  • AndroidAPK下载安装

    千次阅读 2021-06-03 15:56:08
    下载远程服务器端的APK文件2. 同步显示下载进度3. 下载完成自动安装关键技术点:1. SD卡文件读写2. ProgressDialog的使用3. 分线程请求网络4. 安装APK要下载的APK要提前安装到服务器的WEB内容中public void download...
  • apk文件的编译流程图如下:下面逐一说明:项目的源文件结构如下:E:\Example\│ AndroidManifest.xml│├─assets├─res│ ├─drawable-hdpi│ │ icon.png│ ││ ├─drawable-ldpi│ │ icon.png│ ││ ├─...
  • ***************************************************************** 查看安卓APK文件证书的方法****************************************************************(1)用keytool工具将apk文件复制一份,然后重命名...
  • Android 下载Apk并安装

    千次阅读 2021-05-26 08:31:05
    1、自定义加载进度条 在drawable文件夹下新建 layer_progress.xml文件android:endColor="#ffc93a"android:startColor="#ff9f00"/>android:endColor="#ffc93a"android:startColor="#ff9f00"/>2、在布局文件...
  • PHP 下载apk文件

    2021-04-07 08:07:14
    方式一、public function downApkFile(){$path = Env::get(‘root_path‘)."apk/";... //下载文件名//中文需要转码$fileAdd = iconv(‘UTF-8‘, ‘GB2312‘, $path . $file_name);//检查文件是否存在if (!file_exis...
  • dex-tools:将 apk文件内的classes.dex 编译成 .jar 文件 jd-gui: jar包反编译工具 步骤 将 apk 文件后缀名改为 .zip 压缩文件格式 将改名候的压缩文件解压,解压后文件夹内找到classes.dex 文件 下载工具 dex-...
  • /*** 获取apk包的信息:版本号,名称,图标等* @param absPath apk包的绝对路径* @param context*/public void apkInfo(String absPath,Context context) {PackageManager pm = context.getPackageManager();...
  • 如何安装APK文件到自己的android手机里?很多朋友刚拿到G1的时候大概首先就是要往里面装软件了,在ANDROID平台下安装文件的后缀名为“.apk”,就好像PC上的安装文件的后缀名为“.exe”塞班平台安装文件的后缀名为“....
  • Android下载并安装APK

    2021-06-03 14:39:27
    通过DownloadManager来下载APK到本地,下载完成后收到广播再安装APK,可用在软件更新等场合。添加权限Activity源码package com.example.administrator.downloadtest;import android.app.Activity;import android.app....
  •  许多win7系统小伙伴在打开电脑中,经常会看到一些文件格式自己不知道是什么以及不知道要怎么打开,比如apk文件,APK是Android Package的缩写,即Android安装包,几乎所有的安卓应用程序都是这种格式,那么在win7...
  • 现在在大街上,公交车上,餐馆里,都...apk文件一种Android操作系统上的应用程序安装文件格式,,在安卓手机上只要用文件管理器打开这个文件就可以开始安装了。有用户称手机的安装程序在电脑上运行,极大节省了电...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 350,253
精华内容 140,101
关键字:

安卓apk文件下载