Android API之ExternalStorage操作
来源:互联网 发布:浙江大学软件学院学费 编辑:程序博客网 时间:2024/05/16 02:28
官方API文档:
https://developer.android.com/guide/topics/sensors/sensors_environment.html
https://developer.android.com/reference/android/os/Environment.html
/** * Android中外存储设备(SD卡)操作 * * @description: * @author ldm * @date 2016-7-21 上午9:33:53 */public class ExternalStorage extends Activity { // 装载控件的容器 private ViewGroup container; /** * Android的外部存储,在APILevel=8之前,所有的文件都是建议放在Environment.getExternalStorageState()目录下的。 * 从API Level=8开始,对于应用程序的私有文件应该放在Context.getExternalFilesDir目录下。 * 非私有的(shared)的文件应该放在目录下Environment.getExternalStoragePublicDirectory(String)所指定的目录下。 * 私有的文件放在Environment.getExternalStorageDirectory()所指定的目录下。 */ // 非私有图片 private Item mExternalStoragePublicPicture; // 私有图片 private Item mExternalStoragePrivatePicture; // 私有文件 private Item mExternalStoragePrivateFile; // 处存储设备文件扫描广播 private BroadcastReceiver mExternalStorageReceiver; // 外存储是否可用 boolean mExternalStorageAvailable = false; // 外存储是否可写操作 boolean mExternalStorageWriteable = false; // 自定义的Item static class Item { View mRoot; // 创建文件的Button Button mCreate; // 删除文件Button Button mDelete; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.external_storage); initViews(); addViewsToContainer(); startWatchingExternalStorage(); } /** * 给ViewGroup添加View * * @description: * @author ldm * @date 2016-7-21 上午9:06:33 */ private void addViewsToContainer() { mExternalStoragePublicPicture = createStorageControls( "Picture: getExternalStoragePublicDirectory", Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), new View.OnClickListener() { public void onClick(View v) { createExternalStoragePublicPicture(); updateExternalStorageState(); } }, new View.OnClickListener() { public void onClick(View v) { deleteExternalStoragePublicPicture(); updateExternalStorageState(); } }); container.addView(mExternalStoragePublicPicture.mRoot); mExternalStoragePrivatePicture = createStorageControls( "Picture getExternalFilesDir", getExternalFilesDir(Environment.DIRECTORY_PICTURES), new View.OnClickListener() { public void onClick(View v) { createExternalStoragePrivatePicture(); updateExternalStorageState(); } }, new View.OnClickListener() { public void onClick(View v) { deleteExternalStoragePrivatePicture(); updateExternalStorageState(); } }); container.addView(mExternalStoragePrivatePicture.mRoot); mExternalStoragePrivateFile = createStorageControls( "File getExternalFilesDir", getExternalFilesDir(null), new View.OnClickListener() { public void onClick(View v) { createExternalStoragePrivateFile(); updateExternalStorageState(); } }, new View.OnClickListener() { public void onClick(View v) { deleteExternalStoragePrivateFile(); updateExternalStorageState(); } }); container.addView(mExternalStoragePrivateFile.mRoot); } private void initViews() { container = (ViewGroup) findViewById(R.id.container); } @Override protected void onDestroy() { super.onDestroy(); stopWatchingExternalStorage(); } private void handleExternalStorageState(boolean available, boolean writeable) { boolean has = hasExternalStoragePublicPicture(); mExternalStoragePublicPicture.mCreate.setEnabled(writeable && !has); mExternalStoragePublicPicture.mDelete.setEnabled(writeable && has); has = hasExternalStoragePrivatePicture(); mExternalStoragePrivatePicture.mCreate.setEnabled(writeable && !has); mExternalStoragePrivatePicture.mDelete.setEnabled(writeable && has); has = hasExternalStoragePrivateFile(); mExternalStoragePrivateFile.mCreate.setEnabled(writeable && !has); mExternalStoragePrivateFile.mDelete.setEnabled(writeable && has); } private void updateExternalStorageState() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { mExternalStorageAvailable = mExternalStorageWriteable = false; } handleExternalStorageState(mExternalStorageAvailable, mExternalStorageWriteable); } private void startWatchingExternalStorage() { mExternalStorageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { updateExternalStorageState(); } }; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_MEDIA_REMOVED); registerReceiver(mExternalStorageReceiver, filter); updateExternalStorageState(); } private void stopWatchingExternalStorage() { unregisterReceiver(mExternalStorageReceiver); } // 创建外存储中公共图片 private void createExternalStoragePublicPicture() { File path = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File file = new File(path, "DemoPicture.jpg"); try { path.mkdirs(); InputStream is = getResources() .openRawResource(R.drawable.balloons); OutputStream os = new FileOutputStream(file); byte[] data = new byte[is.available()]; is.read(data); os.write(data); is.close(); os.close(); // 媒体文件进行扫描,看是否有新文件,使得MediaProvider同步媒体数据库 // scanFile(Context context, String[] paths, String[] mimeTypes, // OnScanCompletedListener callback) // 传入参数分别是上下文对象,文件路径对应的数组,文件类型及扫描监听 MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } }); } catch (IOException e) { e.printStackTrace(); } } // 删除外存储中是否有指定的公共图片 private void deleteExternalStoragePublicPicture() { File path = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File file = new File(path, "DemoPicture.jpg"); file.delete(); } // 判断外存储中是否有指定的公共图片 private boolean hasExternalStoragePublicPicture() { File path = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File file = new File(path, "DemoPicture.jpg"); return file.exists(); } // 在外存储中创建私有文件 private void createExternalStoragePrivatePicture() { // 创建文件 File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File file = new File(path, "DemoPicture.jpg"); try { InputStream is = getResources() .openRawResource(R.drawable.balloons); OutputStream os = new FileOutputStream(file); byte[] data = new byte[is.available()]; is.read(data); os.write(data); is.close(); os.close(); // 媒体文件进行扫描,看是否有新文件,使得MediaProvider同步媒体数据库 // scanFile(Context context, String[] paths, String[] mimeTypes, // OnScanCompletedListener callback) // 传入参数分别是上下文对象,文件路径对应的数组,文件类型及扫描监听 MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { // 扫描完成后处理 } }); } catch (IOException e) { e.printStackTrace(); } } // 删除外存储中指定的私有图片 private void deleteExternalStoragePrivatePicture() { File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES); if (path != null) { File file = new File(path, "DemoPicture.jpg"); file.delete(); } } // 判断是否有指定的图片 private boolean hasExternalStoragePrivatePicture() { File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES); if (path != null) { File file = new File(path, "DemoPicture.jpg"); return file.exists(); } return false; } //在外存储中创建私有文件 private void createExternalStoragePrivateFile() { File file = new File(getExternalFilesDir(null), "DemoFile.jpg"); try { InputStream is = getResources() .openRawResource(R.drawable.balloons); OutputStream os = new FileOutputStream(file); byte[] data = new byte[is.available()]; is.read(data); os.write(data); is.close(); os.close(); } catch (IOException e) { e.printStackTrace(); } } private void deleteExternalStoragePrivateFile() { // 获取外部存储文件的路径。如果文件存在则删除 File file = new File(getExternalFilesDir(null), "DemoFile.jpg"); if (file != null) { file.delete(); } } private boolean hasExternalStoragePrivateFile() { // 获取外部存储文件的路径。如果文件不存在,则返lse File file = new File(getExternalFilesDir(null), "DemoFile.jpg"); return (file != null) && file.exists(); } /** * * @description:创建Item对View * @author ldm * @date 2016-7-21 上午9:08:00 */ private Item createStorageControls(CharSequence label, File path, View.OnClickListener createClick, View.OnClickListener deleteClick) { // 获取系统LayoutInflater LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); // 始化Item Item item = new Item(); item.mRoot = inflater.inflate(R.layout.external_storage_item, null); TextView tv = (TextView) item.mRoot.findViewById(R.id.label); tv.setText(label); if (path != null) { tv = (TextView) item.mRoot.findViewById(R.id.path); tv.setText(path.toString()); } // 初始化Button及点击事件 item.mCreate = (Button) item.mRoot.findViewById(R.id.create); item.mCreate.setOnClickListener(createClick); item.mDelete = (Button) item.mRoot.findViewById(R.id.delete); item.mDelete.setOnClickListener(deleteClick); return item; }}
—-布局文件——
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none" > <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > </LinearLayout></ScrollView>
0 0
- Android API之ExternalStorage操作
- Android数据存储与IO之三(File存储之ExternalStorage)
- Android外部存储器ExternalStorage的使用
- Android API之Assets下文件操作
- 串口操作之API
- ambari之API操作
- HDFS之API操作
- Android 存储学习之SQLite数据库的基本操作 (使用API操作数据库)
- API - jQuery之操作cookie
- API - jQuery之操作cookie
- hadoop API之:文件操作
- Elasticsearch之API CUED操作
- Kafka之Java API操作
- hadoop API之:文件操作
- Hive 之 Java API 操作
- Android API之getSystemService
- android API之ActivityGroup
- android API之ActivityGroup
- Sublime Text 3 + MarkdownEditing Plugins
- 今年暑假不AC
- CISC与RISC的区别?
- Java开发牛人必备的网站
- Android学习进阶和IoC
- Android API之ExternalStorage操作
- 成长小计-UIImage、UIButton类扩展
- HDG杭州站报名| 分享华为CCE容器云、CloudOpera IES和视频UI开放架构实践
- Java精确计算小数
- 浅谈HHVM
- 【VirtualBox】不能为虚拟电脑 xxx 打开一个新任务
- base64
- 大数据与数据中心
- cocos2dx - 安卓蓝牙游戏(c++调用)