- 浏览: 1225251 次
- 性别:
- 来自: 荆州
文章分类
- 全部博客 (396)
- Android 基础 (72)
- Java 基础 (42)
- Android(动画效果) (26)
- Android(自定义组件) (13)
- Android(手机服务) (38)
- Android(网络相关) (27)
- Android(多媒体) (12)
- Android(小技巧) (30)
- Android(用户界面) (39)
- 基础概念 (24)
- Android组件学习 (21)
- Android数据库相关 (11)
- 生活杂谈 (10)
- 调试技巧部分 (8)
- Sql Server相关 (1)
- Android(xml相关) (2)
- Android 开发 (12)
- 韩语学习 (4)
- Mac添加环境变量的三种方法 (1)
- iPhone开发 (1)
- Android Studio (1)
最新评论
-
ppfbsar:
下载网络文件到SD卡上 -
851228082:
好文!彻底理解单类型导入与按需导入的区别了。还有一点可以通过 ...
谈java的导入(import) -
麦田的设计者:
老乡啊
sqlite 数据库保存图片 -
sf_dream:
我要是读写list、map之类的集合呢
ObjectOutputStream和ObjectInputStream类的学习 -
xfyunyun:
博主,请问webview加载html字符串时怎么进行缓存处理呢 ...
WebView使用总结2(加载HTML内容形式的String)
下面一个一个类的来进行介绍:
1.DownLoadProgress.java主控件界面:
2.当启动一个新线程后,就调用ThreadForRunnable类,此类实现了Runnable接口的类,就调用此类的run方法: ThreadForRunnable.java文件内容:
3.VideoDownload.java这个类文件主要是对各种文件进行下载的一些方法,里面我只使用了setDataSource1()方法,其他的方法,大家可以自己进行测试:
4.DirectoryHelper.java文件,这个文件是在判断SD卡是否存在需要的文件夹的判断,如果没有就新建目标文件夹
5.Constants.java这是个常量类:
6.MediaPlayerListener.java这个文件主要是在文件下载完成后的一些额外播放操作:
最后一个类我基本没有用上,也懒得删除掉了,因为后续完善代码的时候肯定也会用上;
7.main.xml文件很简单:
8.最后是配置文件:
以上就是全部代码,今天大部分时间都用来研究这个了,下班回家整理了,放上来给大家一起学习!!!
1.DownLoadProgress.java主控件界面:
package cn.com; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class DownLoadProgress extends Activity { private Button download;// 下载按钮 private MediaPlayer mMediaPlayer; Thread downThread;// 下载子线程 private ProgressBar myProgressBar;//显示进度条的ProgressBar TextView resultView; //子线程发送消息给UI线程来更新ProgressBar的进度 private Handler handler = new Handler() { public void handleMessage(Message msg) { if (!Thread.currentThread().isInterrupted()) { switch (msg.what) { case 1: int size = msg.getData().getInt("size"); myProgressBar.setProgress(size);// 设置当前刻度 int result = (int) (((float) myProgressBar.getProgress() / (float) myProgressBar .getMax()) * 100); resultView.setText(result + "%"); if (myProgressBar.getMax() == myProgressBar.getProgress()) { Toast.makeText(DownLoadProgress.this, R.string.success, 1).show(); } break; case -1: String error = msg.getData().getString("error"); Toast.makeText(DownLoadProgress.this, error, 1).show(); break; } } super.handleMessage(msg); } }; public Thread getThreadInstance() { return downThread; } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //在SD卡上新建文件夹来进行文件存储 DirectoryHelper fileHelper = new DirectoryHelper(); fileHelper.getSdCardPath(); myProgressBar = (ProgressBar) findViewById(R.id.progressBar); resultView = (TextView) findViewById(R.id.result); download = (Button) findViewById(R.id.download); download.setOnClickListener(new OnClickListener() { public void onClick(View v) { downLoadVideo(); } }); } //新起一个线程进行文件下载 public void downLoadVideo() { mMediaPlayer = new MediaPlayer(); // Sets the audio stream type for this MediaPlayer mMediaPlayer.setAudioStreamType(2); MediaPlayerListener listener = new MediaPlayerListener(); listener.setAllListener(mMediaPlayer); ThreadForRunnable thread = new ThreadForRunnable(this, myProgressBar, handler); new Thread(thread).start(); } }
2.当启动一个新线程后,就调用ThreadForRunnable类,此类实现了Runnable接口的类,就调用此类的run方法: ThreadForRunnable.java文件内容:
package cn.com; import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.Log; import android.widget.ProgressBar; public class ThreadForRunnable implements Runnable { String TAG = "***********************"; Context con; ProgressBar myProgressBar; Handler handler; public ThreadForRunnable(Context con, ProgressBar myProgressBar, Handler handler) { this.con = con; this.myProgressBar = myProgressBar; this.handler = handler; } @Override public void run() { // http://lh5.ggpht.com/_2N-HvtdpHZY/SYjwSZO8emE/AAAAAAAABGI/EHe7N52mywg/s144-c/20090129.jpg // http://forum.ea3w.com/coll_ea3w/attach/2008_10/12237832415.3gp //String url = "http://www.dubblogs.cc:8751/Android/Test/Media/3gp/test.3gp"; //String url = "http://net.itcast.cn/QQWubiSetup.exe"; String url = "http://wd.ggzx.net/myfile/xinge/wozaizheli.mp3"; try { // 在线程运行中,调用自定义函数抓下文件 VideoDownload vd = new VideoDownload(con, url, handler); vd.setDataSource1(); //vd.setDataSource1();// 下特定视频文件 //vd.setDataSource2();//下载exe文件 //vd.setDataSource();// 下载apk文件 //vd.videoGet(); myProgressBar.setMax((int) vd.getFileSize());// 设置进度条的最大刻度 } catch (Exception e) { Message msg = new Message(); msg.what = -1; msg.getData().putString("error", "下载失败"); handler.sendMessage(msg); Log.e(TAG, e.toString()); } } }
3.VideoDownload.java这个类文件主要是对各种文件进行下载的一些方法,里面我只使用了setDataSource1()方法,其他的方法,大家可以自己进行测试:
package cn.com; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.Log; public class VideoDownload { String TAG = "***********************"; Context con; private String downloadUrl;// 下载路径 File dFile1; FileOutputStream outs1; private long fileSize = 0;// 原始文件大小 Handler handler; /** * 获取文件大小 * * @return */ public long getFileSize() { return fileSize; } public VideoDownload(Context con, String url, Handler handler) { this.con = con; this.downloadUrl = url; this.handler = handler; } public void videoGet() {//下载一个视频 try { DefaultHttpClient httpclient = new DefaultHttpClient(); HttpResponse response; HttpPost httpost = new HttpPost(Constants.videoURL); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("type", "video")); nvps.add(new BasicNameValuePair("id", String.valueOf(29))); nvps.add(new BasicNameValuePair("fileId", String.valueOf(1))); httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); // This is always a final response response = httpclient.execute(httpost); HttpEntity entity = response.getEntity(); fileSize = entity.getContentLength(); System.out.println("fileSize----------->" + fileSize); InputStream is = entity.getContent(); if (is == null) { // 680kb throw new RuntimeException("stream is null"); } dFile1 = new File(Constants.filePath, 29 + ".mp4"); FileOutputStream fos = new FileOutputStream(dFile1); int numread = 0; int readLen = 0; byte buf[] = new byte[128]; do { numread = is.read(buf); readLen = readLen + numread; System.out.println("readLen----------->" + readLen); if (fileSize != -1 ) { updateProgressBar(readLen); } if (numread < 0) { break; } fos.write(buf, 0, numread); } while (true); is.close(); } catch (Exception e) { e.printStackTrace(); } } public void apkGet() { try { DefaultHttpClient httpclient = new DefaultHttpClient(); HttpResponse response; HttpPost httpost = new HttpPost(Constants.imageURL); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("type", "demo")); nvps.add(new BasicNameValuePair("id", String.valueOf(29))); nvps.add(new BasicNameValuePair("fileId", "1")); httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); // This is always a final response response = httpclient.execute(httpost); HttpEntity entity = response.getEntity(); fileSize = entity.getContentLength(); System.out.println("fileSize----------->" + fileSize); InputStream is = entity.getContent(); System.out.println("***************************" + is); dFile1 = new File(Constants.filePath, 29 + ".apk"); outs1 = new FileOutputStream(dFile1); byte buf[] = new byte[1024]; int numread = 0; int readLen = 0; do { // Start reading data from the URL stream numread = is.read(buf); readLen = readLen + numread; updateProgressBar(readLen); if (numread < 0) { System.out.println("the end !!!!"); break; } outs1.write(buf, 0, numread); } while (true); // openFile(dFile1); System.out.println("_____apk download success!!!_____"); } catch (Exception e) { e.printStackTrace(); } } //更新进度条(当可以通过getContentLength来获取文件长度的情况下) public void updateProgressBar(int readLen) { Message msg = new Message(); msg.what = 1; msg.getData().putInt("size", readLen); //通过主线程的handler通知主线程更新UI进度条的进度 handler.sendMessage(msg); } /* 自定义setDataSource,由线程启动 */ public void setDataSource1() throws Exception { URL myURL = new URL(downloadUrl); URLConnection conn = myURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); //当可以返回下载文件大小的情况下 //方便后续显示进度条的总内容长度 fileSize = conn.getContentLength(); System.out.println("fileSize--------------->" + fileSize); //将下载文件保存到指定文件夹 File myFileTemp = new File(Constants.filePath, "video." + getFileExtension(downloadUrl)); // the file to which this stream writes FileOutputStream fos = new FileOutputStream(myFileTemp); byte buf[] = new byte[128]; int numread = 0; int readLen = 0; do { numread = is.read(buf); if (numread <= 0) { break; } fos.write(buf, 0, numread); readLen = readLen + numread; System.out.println("readLen----------->" + readLen); if(fileSize != -1) //不断的更新进度条 updateProgressBar(readLen); } while (true); try { is.close(); System.out.println("Download is over!!!!!!"); } catch (Exception ex) { Log.e(TAG, "error: " + ex.getMessage(), ex); } } //下载特定类型文件 public void setDataSource2() throws Exception { URL myURL = new URL(downloadUrl); HttpURLConnection conn = (HttpURLConnection) myURL.openConnection(); conn.setConnectTimeout(6 * 1000); conn.setRequestMethod("GET"); conn.setRequestProperty( "Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"); conn.setRequestProperty("Accept-Language", "zh-CN"); conn.setRequestProperty("Referer", downloadUrl); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty( "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.connect(); InputStream is = conn.getInputStream(); fileSize = conn.getContentLength(); System.out.println("fileSize--------------->" + fileSize); File myFileTemp = new File(Constants.filePath, "video." + getFileExtension(downloadUrl)); // the file to which this stream writes FileOutputStream fos = new FileOutputStream(myFileTemp); byte buf[] = new byte[128]; int numread = 0; int readLen = 0; do { numread = is.read(buf); if (numread <= 0) { break; } fos.write(buf, 0, numread); readLen = readLen + numread; updateProgressBar(readLen); } while (true); try { is.close(); System.out.println("Download is over!!!!!!"); } catch (Exception ex) { Log.e(TAG, "error: " + ex.getMessage(), ex); } } // 取得加载文件的后缀名 private String getFileExtension(String strFileName) { File myFile = new File(strFileName); String strFileExtension = myFile.getName(); strFileExtension = (strFileExtension.substring(strFileExtension .lastIndexOf(".") + 1)).toLowerCase(); if (strFileExtension == "") { /* 若无法顺利取得扩展名,默认为.dat */ strFileExtension = "dat"; } return strFileExtension; } }
4.DirectoryHelper.java文件,这个文件是在判断SD卡是否存在需要的文件夹的判断,如果没有就新建目标文件夹
package cn.com; import java.io.File; import android.os.Environment; public class DirectoryHelper { //构建应用在SD卡上的相关文件夹 public void getSdCardPath() { File sdcardDir = Environment.getExternalStorageDirectory(); String path = sdcardDir.getParent() + sdcardDir.getName(); Constants.filePath = path + java.io.File.separator + "VideoDownLoad"; System.out.println("__________" + Constants.filePath); createFile(); } public void createFile() { try { // 1.判断是否存在sdcard if (Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { // 目录 System.out.println("_______create Directory________"); File path = new File(Constants.filePath); if (!path.exists()) { // 2.创建目录,可以在应用启动的时候创建 path.mkdirs(); } // 文件 // File f = new File(fileDirectory + "/notes.txt"); // if (!f.exists()) { // // 3.创建文件 // f.createNewFile(); // } } } catch (Exception e) { e.printStackTrace(); } } }
5.Constants.java这是个常量类:
package cn.com; public class Constants { //这里的地址大家可以自己修改下 public static String filePath = ""; public final static String HOST = "********"; public final static int PORT = **; public final static String HOST_IP = "http://" + HOST + ":" + PORT; public static String imageURL = HOST_IP + "****************"; public final static String videoURL = HOST_IP + "********"; }
6.MediaPlayerListener.java这个文件主要是在文件下载完成后的一些额外播放操作:
package cn.com; import android.media.MediaPlayer; import android.util.Log; public class MediaPlayerListener { String TAG = "_____TAG_____"; public MediaPlayerListener() { } public void setAllListener(MediaPlayer mMediaPlayer) { mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { // TODO Auto-generated method stub Log.i(TAG, "Error on Listener, what: " + what + "extra: " + extra); return false; } }); mMediaPlayer .setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // TODO Auto-generated method stub Log.i(TAG, "Update buffer: " + Integer.toString(percent) + "%"); } }); mMediaPlayer .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub Log.i(TAG, "mMediaPlayer Listener Completed"); } }); mMediaPlayer .setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // TODO Auto-generated method stub Log.i(TAG, "Prepared Listener"); } }); } }
最后一个类我基本没有用上,也懒得删除掉了,因为后续完善代码的时候肯定也会用上;
7.main.xml文件很简单:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ProgressBar android:layout_width="fill_parent" android:layout_height="18dip" style="?android:attr/progressBarStyleHorizontal" android:id="@+id/progressBar" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:id="@+id/result" /> <Button android:text="download" android:id="@+id/download" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout>
8.最后是配置文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.com" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".DownLoadProgress" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 访问internet权限 --> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
以上就是全部代码,今天大部分时间都用来研究这个了,下班回家整理了,放上来给大家一起学习!!!
- DownLoadProgress.rar (68.1 KB)
- 下载次数: 136
发表评论
-
WebView加载网页进度条显示
2012-03-06 19:52 2345重写WebChromeClient一个方法进行进度条显示: ... -
基于UDP协议的数据交互例子
2011-12-18 11:06 1703直接贴上代码: 客户端: package com.exam ... -
一种更灵活的数据传输方式:HTTP(2)
2011-12-16 11:18 2987HTTP是大多数应用程序中常用的与服务端交互的通讯方式 ... -
一种更灵活的数据传输方式:HTTP(1)
2011-12-16 10:52 1948使用WebService虽然 ... -
重用WebView的cache图片文件
2011-09-15 15:06 2031如何从WebView使用的cache文件夹中重复使用一些图片资 ... -
开,关闭GPRS的简单Demo
2011-06-09 10:54 2731Android应用中开,关闭GPRS的简单Demo,可能在有的 ... -
Intent打开各种类型文件
2011-04-10 18:22 4419//android获取一个用于打开PPT文件的intent ... -
图片Url保存为位图并进行缩放操作
2010-10-12 15:33 13561.通过传入图片url获取位图方法: public Bit ... -
判断手机有无网络
2010-09-15 16:18 2839ConnectivityManager cwjManage ... -
GoogleMap(通过输入地址,查询显示在google 地图上)
2010-08-15 10:18 4651主Activity: package net.blogja ... -
Android手机使用中国电信天翼上网设置
2010-08-07 16:01 3843众所周知Android手机的上网功能需要用到APN(网络接入点 ... -
GPS取得卫星个数
2010-08-07 15:09 2937LocationManager manager = (Lo ... -
连接服务器超时的Demo
2010-08-05 11:49 2416下面这个例子是连接网络超时的例子: package cn. ... -
下载网路图片到SD卡上新建文件夹当中
2010-07-27 22:52 31901.DownloadImages.java文件 packa ... -
sax方式解析xml文件(asset文件和网络文件)
2010-07-11 17:16 1965现在写了些博客后,变懒 ... -
xml中DOM对象的学习
2010-07-03 13:57 1282DOM的基本对象有5个:Doc ... -
DOM方式解析xml文件3(assets中xml文件)
2010-07-03 13:44 2564这个例子是进一步熟悉DOM解析xml文件的方法,附带基础的文档 ... -
DOM方式解析xml文件2(解析本地xml)
2010-07-01 20:42 1585这个与1的方法唯一不同的就是传递InputSource的参数: ... -
DOM方式解析xml文件1(解析网路xml)
2010-07-01 20:14 1584其实网上很多资料讲关 ... -
下载显示网路图片的例子
2010-07-01 10:46 1484一个很简单的例子,直接上代码: 1. ShowUrlImage ...
相关推荐
在本文中,我们将深入探讨如何使用RTThread操作系统、STM32F407VE微控制器、ESP8226 Wi-Fi模块以及SD卡,实现从网络下载文件并将其存储到SD卡上的完整流程。这个项目涉及到嵌入式系统开发中的多个关键环节,包括网络...
本教程主要介绍如何在Android应用中实现网络文件的下载并保存到SD卡。 1. **Android权限设置** 在AndroidManifest.xml文件中,你需要添加写入外部存储的权限: ```xml ``` 如果你的应用目标API等级高于23,还...
本篇文章将详细介绍如何在Android中将下载的MP3文件存放到虚拟SD卡中。 首先,理解Android的存储权限至关重要。自Android 6.0(API级别23)开始,应用需要在运行时请求`WRITE_EXTERNAL_STORAGE`和`READ_EXTERNAL_...
TCP服务器可以监听特定端口,当收到客户端的数据请求时,接收到的数据可以被解析并写入SD卡上的.csv文件。TCP协议提供了可靠的数据传输,确保数据的完整性和顺序。 在TCP服务器编程中,我们需要处理连接建立、数据...
"从网络上下载安智apk到sd卡"这个主题涉及到的主要知识点包括网络请求、文件下载以及文件管理,尤其是针对Android平台的实践操作。下面我们将逐一展开这些知识点。 首先,**网络请求**是整个过程的起点。通常,我们...
在Android开发中,异步下载图片并保存到SD卡是一个常见的需求,特别是在构建涉及大量图像显示的应用时。这个过程涉及到网络请求、线程管理、内存和磁盘缓存策略等多个技术点。以下是对这个主题的详细阐述: 1. **...
同时,提供下载功能,将网络资源保存到SD卡,需要用到`java.net.URL`和`java.io.InputStream`等网络编程接口。 三、创建简单的SD卡文件浏览器 3.1 UI设计 使用Android Studio和XML布局文件,构建文件列表界面和...
### Android之网络文件下载保存到SD卡上的关键技术点 #### 一、概述 在Android开发过程中,有时我们需要从网络上下载文件并将其保存至SD卡上。本文将详细介绍这一过程中的关键技术点,包括如何获取SD卡状态、权限...
在Block Design中,确保网络接口的速率设置为100Mbps或1000Mbps,这主要影响网络连接的速度,但对保存环境变量到SD卡的过程没有直接影响。 接下来,通过Petalinux工具生成设备树源文件(Device Tree Source, DTS)...
遍历SD卡目录,获取到所有视频文件后,将文件路径和名称显示在列表中。用户选择文件后,传递选中的文件路径给视频播放器进行播放。 5. **错误处理和优化**:在实际开发中,需要考虑各种异常情况,如文件不存在、...
3. **写入SD卡**:使用特定的工具(如`dd`命令在Linux或Mac上,或者使用Win32DiskImager在Windows上)将"SD_IMAGE"文件写入SD卡。确保选择正确的设备,以免误操作导致数据丢失。 4. **插入SD卡**:将格式化并写入了...
在实际项目中,可能还需要考虑到**错误处理**和**异常情况**,例如网络中断、SD卡读写错误等。通过适当的错误检测机制和恢复策略,可以提高系统的稳定性和可靠性。 总的来说,STM32F407+ESP8266实现图片传输并保存...
标题中的“下载图片并保存到SD卡中”指的是在Android平台上,从网络上获取图片资源并将其存储到设备的外部存储(通常称为SD卡)的过程。这个过程涉及到网络请求、文件操作以及Android权限管理等技术。 首先,我们...
"Android手机SD卡文件浏览器"就是这样一个工具,它允许用户方便地浏览、管理手机上的SD卡文件,为日常操作提供了极大的便利。本文将深入探讨这一应用的核心功能及其实现原理。 首先,Android系统的文件系统基于...
在Android开发中,有时我们需要从网络下载视频文件并将其存储在用户的本地设备上,以便之后在VideoView组件中播放。这个过程涉及到多个关键步骤,包括网络请求、文件下载、存储管理和播放控制。以下是对这些知识点的...
以上就是关于"下载网络图片展示和保存到SD卡"的主要技术点,这些知识点涵盖了网络请求、多线程、图片处理、文件操作以及权限管理等多个方面,是Android开发者必备的基础技能。在实际开发中,合理运用这些知识点可以...
在本文中,我们将详细探讨如何将Ubuntu 16的根文件系统烧写到SD卡上,这个过程同样适用于其他Linux根文件系统的移植。这是一项在嵌入式开发中常见的任务,特别是对于使用NXP等处理器的开发板。下面是一步一步的详细...
- 理解如何备份和恢复内存卡上的数据,以防意外丢失。 - 学习如何正确地移除和插入内存卡,避免损坏卡槽或数据丢失。 总的来说,这个“N72原装内存卡文件和词典数据库安装包”为用户提供了一个恢复手机功能和提升...