ApiDemos学习知识点Content-ExternalStorage(8)
来源:互联网 发布:centos vncserver 安装 编辑:程序博客网 时间:2024/06/16 05:19
演示了如何读写外部存储卡。演示了三种情况:
* 1.向存储卡的共享目录中的图片目录中写入一张图片:
* 位置为:/storage/sdcard/Pictures
* 2.向本地应用的图片目录中写入一张图片
* 位置为:/storage/sdcard/Android/data/包名/files/Pictures
* 3.向本地应用的目录中写入一个文件
实现功能代码
* 1.向存储卡的共享目录中的图片目录中写入一张图片:
* 位置为:/storage/sdcard/Pictures
* 2.向本地应用的图片目录中写入一张图片
* 位置为:/storage/sdcard/Android/data/包名/files/Pictures
* 3.向本地应用的目录中写入一个文件
* 位置为:/storage/sdcard/android/data/包名/files/
首先来看下布局和代码吧
<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/layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > </LinearLayout></ScrollView>item布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/label" style="?android:attr/textAppearanceMediumInverse" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0" android:background="#888" android:padding="4dip" android:singleLine="true" android:color="?android:attr/textColorPrimaryInverse" /> <TextView android:id="@+id/path" style="?android:attr/textAppearanceSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0" android:padding="4dip" android:singleLine="true" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <View android:layout_width="0dip" android:layout_height="0dip" android:layout_weight="1" /> <Button android:id="@+id/create" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/create" /> <View android:layout_width="0dip" android:layout_height="0dip" android:layout_weight="1" /> <Button android:id="@+id/delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/delete" /> <View android:layout_width="0dip" android:layout_height="0dip" android:layout_weight="1" /> </LinearLayout></LinearLayout>
实现功能代码
public class ExternalStorage extends Activity { ViewGroup mLayout; //定义一个类,用于管理每种情况的布局,因为是一样的布局,所以可以达到利用的目的 static class Item { View mRoot; Button mCreate; Button mDelete; }// 定义三种情况下的布局 Item mExternalStoragePublicPicture; Item mExternalStoragePrivatePicture; Item mExternalStoragePrivateFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.external_storage); mLayout = (ViewGroup)findViewById(R.id.layout); 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(); } }); mLayout.addView(mExternalStoragePublicPicture.mRoot);
// 注意这个方法不在Environment里面而是在Activity当中 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(); } }); mLayout.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(); } }); mLayout.addView(mExternalStoragePrivateFile.mRoot); startWatchingExternalStorage(); } @Override protected void onDestroy() { super.onDestroy(); stopWatchingExternalStorage(); } 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); }//定义一个广播接收者,用于监视外部存储卡的挂载状态 BroadcastReceiver mExternalStorageReceiver; boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; 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); } void startWatchingExternalStorage() { mExternalStorageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.i("test", "Storage: " + intent.getData()); updateExternalStorageState(); } };
//注册广播接收者 IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_MEDIA_REMOVED); registerReceiver(mExternalStorageReceiver, filter); updateExternalStorageState(); } void stopWatchingExternalStorage() { unregisterReceiver(mExternalStorageReceiver); } void createExternalStoragePublicPicture() { // Create a path where we will place our picture in the user's // public pictures directory. Note that you should be careful about // what you place here, since the user often manages these files. For // pictures and other media owned by the application, consider // Context.getExternalMediaDir(). File path = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File file = new File(path, "DemoPicture.jpg"); try { // Make sure the Pictures directory exists. path.mkdirs(); // Very simple code to copy a picture from the application's // resource into the external file. Note that this code does // no error checking, and assumes the picture is small (does not // try to copy it in chunks). Note that if external storage is // not currently mounted this will silently fail. 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(); // Tell the media scanner about the new file so that it is // immediately available to the user. 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) { // Unable to create file, likely because external storage is // not currently mounted. Log.w("ExternalStorage", "Error writing " + file, e); } } void deleteExternalStoragePublicPicture() { // Create a path where we will place our picture in the user's // public pictures directory and delete the file. If external // storage is not currently mounted this will fail. File path = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File file = new File(path, "DemoPicture.jpg"); file.delete(); } boolean hasExternalStoragePublicPicture() { // Create a path where we will place our picture in the user's // public pictures directory and check if the file exists. If // external storage is not currently mounted this will think the // picture doesn't exist. File path = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File file = new File(path, "DemoPicture.jpg"); return file.exists(); } void createExternalStoragePrivatePicture() { // Create a path where we will place our picture in our own private // pictures directory. Note that we don't really need to place a // picture in DIRECTORY_PICTURES, since the media scanner will see // all media in these directories; this may be useful with other // media types such as DIRECTORY_MUSIC however to help it classify // your media for display to the user. File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File file = new File(path, "DemoPicture.jpg"); try { // Very simple code to copy a picture from the application's // resource into the external file. Note that this code does // no error checking, and assumes the picture is small (does not // try to copy it in chunks). Note that if external storage is // not currently mounted this will silently fail. 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(); // Tell the media scanner about the new file so that it is // immediately available to the user. 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) { // Unable to create file, likely because external storage is // not currently mounted. Log.w("ExternalStorage", "Error writing " + file, e); } } void deleteExternalStoragePrivatePicture() { // File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES); if (path != null) { File file = new File(path, "DemoPicture.jpg"); file.delete(); } } boolean hasExternalStoragePrivatePicture() { // 该方法将一张图片复制到外部存储卡本地应用目录下的图片目录下 File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES); if (path != null) { File file = new File(path, "DemoPicture.jpg"); return file.exists(); } return false; }// 该方法将一张图片复制到外部存储卡本地应用目录下 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) { Log.w("ExternalStorage", "Error writing " + file, e); } } void deleteExternalStoragePrivateFile() { // 删除已存在的文件 File file = new File(getExternalFilesDir(null), "DemoFile.jpg"); if (file != null) { file.delete(); } } boolean hasExternalStoragePrivateFile() { // 判断是否已经存在该名字的文件 File file = new File(getExternalFilesDir(null), "DemoFile.jpg"); if (file != null) { return file.exists(); } return false; }/* * 创建每种情况下的布局 */ Item createStorageControls(CharSequence label, File path, View.OnClickListener createClick, View.OnClickListener deleteClick) { LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); 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()); } 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; }}
阅读全文
0 0
- ApiDemos学习知识点Content-ExternalStorage(8)
- ApiDemos学习知识点Content-ClipBoard(3)
- ApiDemos学习知识点Content-Asset(4)
- ApiDemos学习知识点Content-PickContacts(5)
- ApiDemos学习知识点Content-InstallApk(6)
- ApiDemos学习知识点Content-Rescoures(7)
- ApiDemos知识点学习(一)
- ApiDemos学习知识点之Sensors
- ApiDemos学习知识点之media-VideoView(10)
- ApiDemos学习知识点之Animation-AnimationCloing
- ApiDemos学习知识点之media-AudioFx(9)
- ApiDemos学习知识点之media-MediaPlayer_Audio&MediaPlayer_Video(11)
- ApiDemos学习知识点之media-MediaPlayerDemo(12)
- ApiDemos学习知识点之os-MorseCode(13)
- ApiDemos学习知识点之os-RotationVector(14)
- APIDemos 学习
- ApiDemos学习
- ApiDemos知识点之Text(2)
- Angular JS 面包屑
- Python学习笔记(一)数据类型
- Android 操作系统中的内存回收
- android解析json数组
- sublime text3 绑定快捷键
- ApiDemos学习知识点Content-ExternalStorage(8)
- 树莓派安装zbar
- Hdu 5593 ZYB's Tree【树型Dp】经典题
- 操作日志 | 厉兵秣马,冲锋号起!!!
- python基础-01
- 环信webIM即时通讯学习笔记
- Linux网络编程
- java.lang.NoClassDefFoundError: org/springframework/asm/ClassVisitor
- Linux常用命令