`

远程下载安装apk文件到手机或模拟器

阅读更多
废话少说,直接上代码,会加上详细注释:
测试地址:http://www.dubblogs.cc:8751/Android/Test/Apk/EX04_14.apk

package cn.com;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.URLUtil;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; 

/*必须引用java.io与java.net*/

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;


public class InstallUrlApk extends Activity
{
  private TextView mTextView01;
  private EditText mEditText01;

//点击下载的按钮

  private Button mButton01;
  private static final String TAG = "DOWNLOADAPK";
  private String currentFilePath = "";
  private String currentTempFilePath = "";
  private String strURL = "";
  private String fileEx = "";
  private String fileNa = "";

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mTextView01 = (TextView) findViewById(R.id.myTextView1);
    mButton01 = (Button) findViewById(R.id.myButton1);
    mEditText01 = (EditText) findViewById(R.id.myEditText1);

    mButton01.setOnClickListener(new Button.OnClickListener()
    {
      public void onClick(View v)
      {
        /* 文件会下载至local端 */
        mTextView01.setText("下载中...");
        strURL = mEditText01.getText().toString();
        /取得欲安装程序之文件名称(后缀名)
        fileEx = strURL.substring(strURL.lastIndexOf(".") + 1, strURL.length())
            .toLowerCase();

        System.out.println("***************fileEx =" + fileEx);

        fileNa = strURL.substring(strURL.lastIndexOf("/") + 1, strURL
            .lastIndexOf("."));

        System.out.println("***************fileNa =" + fileNa);

        //开启一个子线程进行文件的下载
        getFile(strURL);
      }
    });

    mEditText01.setOnClickListener(new EditText.OnClickListener()
    {
      @Override
      public void onClick(View arg0)
      {
        // TODO Auto-generated method stub
        mEditText01.setText("");
        mTextView01.setText("远程安装程序(请输入URL)");
      }
    });
  }

  /* 处理下载URL文件自定义函数 */
  private void getFile(final String strPath)
  {
    try
    {
      if (strPath.equals(currentFilePath))
      {
        getDataSource(strPath);
      }
      currentFilePath = strPath;
      Runnable r = new Runnable()
      {
        public void run()
        {
          try
          {
            // 开启一个线程进行远程文件下载
            getDataSource(strPath);
          } catch (Exception e)
          {
            Log.e(TAG, e.getMessage(), e);
          }
        }
      };
      new Thread(r).start();
    } catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  /* 取得远程文件 */
  private void getDataSource(String strPath) throws Exception
  {
//如果是一个正确的网址,就返回true
    if (!URLUtil.isNetworkUrl(strPath))
    {
      mTextView01.setText("错误的URL");
    } else
    {
      /* 取得URL */
      URL myURL = new URL(strPath);
      /* 创建连接 */
      URLConnection conn = myURL.openConnection();
      conn.connect();
      /* InputStream 下载文件 */
      InputStream is = conn.getInputStream();
      if (is == null)
      {
        throw new RuntimeException("stream is null");
      }
      // 创建临时文件 
      // 两个参数分别为前缀和后缀
      File myTempFile = File.createTempFile(fileNa, "." + fileEx);

      /* 取得站存盘案路径 */
      currentTempFilePath = myTempFile.getAbsolutePath();
      /* 将文件写入暂存盘 */
      FileOutputStream fos = new FileOutputStream(myTempFile);
      byte buf[] = new byte[128];
      do
      {
        int numread = is.read(buf);
        if (numread <= 0)
        {
          break;
        }
        fos.write(buf, 0, numread);
      } while (true);

      // 打开文件进行安装(下载完成后执行的操作)
      openFile(myTempFile);
      try
      {
        is.close();
      } catch (Exception ex)
      {
        Log.e(TAG, "error: " + ex.getMessage(), ex);
      }
    }
  }

  // 在手机上打开文件的method
  private void openFile(File f)
  {
    Intent intent = new Intent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setAction(android.content.Intent.ACTION_VIEW);

    /* 调用getMIMEType()来取得MimeType */
    String type = getMIMEType(f);
    /* 设置intent的file与MimeType */
    intent.setDataAndType(Uri.fromFile(f), type);
    startActivity(intent);
  }

  /* 判断文件MimeType的method */
  private String getMIMEType(File f)
  {
    String type = "";
    String fName = f.getName();
    /* 取得扩展名 */
    String end = fName.substring(fName.lastIndexOf(".") + 1, fName.length())
        .toLowerCase();

    /* 依扩展名的类型决定MimeType */
    if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")
        || end.equals("xmf") || end.equals("ogg") || end.equals("wav"))
    {
      type = "audio";
    } else if (end.equals("3gp") || end.equals("mp4"))
    {
      type = "video";
    } else if (end.equals("jpg") || end.equals("gif") || end.equals("png")
        || end.equals("jpeg") || end.equals("bmp"))
    {
      type = "image";
    } else if (end.equals("apk"))
    {
      /* android.permission.INSTALL_PACKAGES */
      type = "application/vnd.android.package-archive";
    } else
    {
      type = "*";
    }
    /* 如果无法直接打开,就跳出软件列表给用户选择 */
    if (end.equals("apk"))
    {
    } else
    {
      type += "/*";
    }
    return type;
  }

  /* 自定义删除文件方法 */
  private void delFile(String strFileName)
  {
    File myFile = new File(strFileName);
    if (myFile.exists())
    {
      myFile.delete();
    }
  }

  /* 当Activity处于onPause状态时,更改TextView文字状态 */
  @Override
  protected void onPause()
  {
    mTextView01 = (TextView) findViewById(R.id.myTextView1);
    mTextView01.setText("下载成功");
    super.onPause();
  }

  /* 当Activity处于onResume状态时,删除临时文件 */
  @Override
  protected void onResume()
  {
    // TODO Auto-generated method stub
    /* 删除临时文件 */
    delFile(currentTempFilePath);
    super.onResume();
  }
}

另外例子中还可以通过
System.out.println("conn.getContentLength() =" + conn.getContentLength());
获取下载文件的大小,然后来实现PrgressBar的下载进度显示
分享到:
评论
4 楼 冥风圣六翼 2012-05-14  
楼主你抄归抄,要是能给出详细的讲解和你自己的认识我也会感谢你的,这你妹的抄一段教程上的源码过来有个P意义,连注释都抄的一样
3 楼 xurick 2011-09-23  
另外例子中还可以通过
Java代码 
System.out.println("conn.getContentLength() =" + conn.getContentLength()); 
获取下载文件的大小,然后来实现PrgressBar的下载进度显示


楼主这方面有研究过吗?我的listview中的ProgressBar不刷新进度。。。网络线程与listview中的一个元素如何关联更新的?还望指教
2 楼 LuoYer 2011-02-11  
太好了,正好用到,感谢ing。
getFile里面strPath.equals(currentFilePath)条件下会掉一次getDataSource(strPath);
主要作用是干嘛的呢。
1 楼 edison_cool911 2010-06-21  
大家可以通过这个地址进行测试:
http://www.dubblogs.cc:8751/Android/Test/Apk/EX04_14.apk

相关推荐

    Android模拟器安装APK文件

    #### 一、安装APK文件到Android模拟器 在进行Android应用程序开发的过程中,开发者经常需要在模拟器上安装APK文件以进行测试。APK(Android Package Kit)文件是一种Android平台上的安装包格式,类似于Windows平台...

    手机顽童模拟器 V0.7.0.061222 Beta

    8. **开发者工具集**:对于专业开发者,手机顽童模拟器可能提供了ADB(Android Debug Bridge)支持,方便进行日志查看、安装卸载APK、远程调试等操作。 9. **社区支持**:作为一款Beta版软件,开发者通常会有活跃的...

    phoneGap手机安装apk

    如果你想要直接安装apk文件,可以找到生成的`platforms/android/build/outputs/apk`目录下的apk文件,通过adb(Android Debug Bridge)工具将其推送到设备上,或者通过USB连接设备并在设置中开启未知来源安装权限,...

    Android 如何远程下载安装的应用源码.zip

    - 下载的APK文件需要保存到本地,通常选择`getExternalFilesDir()`或`getCacheDir()`方法获取外部存储或内部缓存目录,以便在用户安装前保存APK。 4. **权限管理**: - 自Android 6.0(API级别23)起,运行时权限...

    Android 如何远程下载安装的应用源码.rar

    在Android平台上,开发人员经常需要从远程服务器下载并安装应用的源码,以便进行调试、学习或更新。本文将深入探讨如何实现这一过程,并提供一个详细的步骤指南。 首先,了解Android应用的生命周期和安装机制是至关...

    第三方模拟器

    4. **adb install xxx.apk** - 安装指定的APK文件到模拟器或真实手机。 5. **adb uninstall 应用程序的包名** - 卸载指定的应用程序。 6. **adb push pc_file phone_file** - 将电脑上的文件复制到手机上。 7. **adb...

    apk启动Uiautomato脚本,供参考哈

    2. **打包Uiautomator到apk**:将编写好的Uiautomator代码作为apk的一个部分,通常放在assets或res目录下,确保在安装apk时一并部署。 3. **启动服务**:在apk的主程序或者自定义的BroadcastReceiver中,通过反射...

    androidterm安卓终端模拟器.rar

    只需将这个apk文件通过蓝牙、USB或者网络下载到Android设备上,然后通过文件管理器找到并点击安装,遵循屏幕提示完成安装过程即可。需要注意的是,由于安全设置,可能需要在设备的“设置”中开启“未知来源”的应用...

    android将lib库打包成apk安装

    安装APK到设备或模拟器上,Java代码可以通过JNI调用C/C++实现的功能。如果需要调试C/C++代码,可以使用NDK提供的gdbserver和Android Studio的远程调试功能。 总结,这个压缩包包含了一个完整的例子,展示了如何在...

    Mac怎么安装Andriod模拟器.docx

    如果你是开发者,可以安装Android Studio,并通过它将APK文件部署到模拟器中进行调试和测试。 9. 为了进一步优化体验,你可以在Parallels Desktop的设置中调整虚拟机的性能参数,比如增加分配给Android的内存,或者...

    C#发送ADB指令到手机

    例如,发送"adb devices"命令以检查连接的设备,或者"adb install"命令来安装APK文件。 描述中提到的Winform是Windows Forms,它是.NET Framework提供的一个用于构建桌面应用程序的库。在这个项目中,开发者可能...

    RE资源管理器以及终端模拟器

    2. **安装和管理软件包**:通过apt-get或adb命令安装、更新、卸载APK文件。 3. **调试系统服务**:检查系统状态,启动、停止或重启服务。 4. **运行脚本**:支持运行bash、python等脚本文件,自动化执行一系列操作...

    android模拟器配置

    2. **安装应用**:`adb install &lt;apk路径&gt;`,例如`adb install path/to/your/app.apk`,将APK文件安装到设备上。 3. **卸载应用**:`adb uninstall &lt;包名&gt;`,如`adb uninstall com.example.myapp`,删除指定应用。 ...

    android shell apk

    描述中提到,“android上面执行终端的程序,安装就可以使用”,意味着用户可以通过安装这个APK文件(migoolan.terminal.apk)在Android设备上获得一个终端工具,无需额外的配置或权限,安装完成后就能直接运行,执行...

    Android调试桥(ADB)

    4. **安装软件**:ADB能够方便地安装APK文件到设备或模拟器,这对于测试和部署应用非常方便。 5. **Monkey测试**:ADB附带了一个名为Monkey的工具,可以生成随机用户事件流,用于压力测试应用的稳定性。 6. **日志...

    ADB远程调试工具,远程网络调试

    ADB(Android Debug Bridge)是Android开发中的一个强大工具,它允许开发者通过USB或网络连接对设备进行调试、传输文件、运行命令以及管理Android设备或模拟器。本压缩包提供了ADB远程调试的相关工具和指南,帮助...

Global site tag (gtag.js) - Google Analytics