我们知道Android两个应用程序之间进行数据交互需要通过ContentProvider,而且通常都是数据库的操作。
今天项目需要使用Android的ContentProvider交互普通SD卡上的文件,于是我写了这个小例子:
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>                                                                                                        

TestContentProvider.java
package com.h3c.test;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.util.ArrayList;import android.content.ContentProvider;import android.content.ContentProviderOperation;import android.content.ContentProviderResult;import android.content.ContentValues;import android.content.OperationApplicationException;import android.content.res.AssetFileDescriptor;import android.database.Cursor;import android.net.Uri;import android.os.Environment;import android.os.ParcelFileDescriptor;import android.util.Log;public class TestContentProvider extends ContentProvider {    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        // TODO Auto-generated method stub        Log.e("H3c", "delete");        return 0;    }    @Override    public String getType(Uri uri) {        // TODO Auto-generated method stub        Log.e("H3c", "gettype");        return null;    }    @Override    public Uri insert(Uri uri, ContentValues values) {        // TODO Auto-generated method stub        Log.e("H3c", "insert");        return null;    }    @Override    public boolean onCreate() {        // TODO Auto-generated method stub        Log.e("H3c", "create");        return false;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection,            String[] selectionArgs, String sortOrder) {        // TODO Auto-generated method stub        Log.e("H3c", "query");        return null;    }    @Override    public int update(Uri uri, ContentValues values, String selection,            String[] selectionArgs) {        // TODO Auto-generated method stub        Log.e("H3c", "update");        return 0;    }    @Override    public AssetFileDescriptor openAssetFile(Uri uri, String mode)            throws FileNotFoundException {        // TODO Auto-generated method stub        Log.e("H3c", "openAssetFile");        return super.openAssetFile(uri, mode);    }    //此方法非常重要,一定要重写,否则默认报FileNotFound异常    @Override    public ParcelFileDescriptor openFile(Uri uri, String mode)            throws FileNotFoundException {        // TODO Auto-generated method stub        File root = Environment.getExternalStorageDirectory();        root.mkdirs();        File path = new File(root, uri.getEncodedPath());        Log.e("H3c", "opeFile:"+path);        int imode = 0;        if (mode.contains("w")) {            imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;            if (!path.exists()) {                try {                    path.createNewFile();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        if (mode.contains("r"))            imode |= ParcelFileDescriptor.MODE_READ_ONLY;        if (mode.contains("+"))            imode |= ParcelFileDescriptor.MODE_APPEND;        return ParcelFileDescriptor.open(path, imode);    }}

NotepadTestActivity.java
package com.h3c.test;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager.NameNotFoundException;import android.content.res.AssetFileDescriptor;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class NotepadTestActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.notepad);        Button button = (Button) findViewById(R.id.notepad);        button.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                try {                    // 直接读文件                    // InputStream is = getContentResolver().openInputStream(                    // Uri.parse("file:/mnt/sdcard/h3c.txt"));                    //                    // File bkFile = new File("/mnt/sdcard/h3c2.txt");                    // if (!bkFile.exists()) {                    // bkFile.createNewFile();                    // }                    //                                        // FileOutputStream out = new FileOutputStream(bkFile);                    // byte[] b = new byte[1024 * 5]; // 5KB                    // int len;                    // while ((len = is.read(b)) != -1) {                    // out.write(b, 0, len);                    // }                    // out.flush();                    // is.close();                    // out.close();                    // 直接写文件                    // OutputStream out = getContentResolver().openOutputStream(                    // Uri.parse("file:/mnt/sdcard/h3c.txt"));                    // FileInputStream in = new FileInputStream(new File(                    // "/mnt/sdcard/h3c3.txt"));                    //                    // byte[] b = new byte[1024 * 5]; // 5KB                    // int len;                    // while ((len = in.read(b)) != -1) {                    // out.write(b, 0, len);                    // }                    // out.flush();                    //                                        // in.close();                    // out.close();                    // 内容流写                    // AssetFileDescriptor afd = getContentResolver()                    // .openAssetFileDescriptor(                    // Uri.parse("content://com.h3c.test/h3c.txt"),                    // "wr");                    // InputStream in = afd.createInputStream();                    // File bkFile = new File("/mnt/sdcard/h3c2.txt");                    // if (!bkFile.exists()) {                    // bkFile.createNewFile();                    // }                    //                    // FileOutputStream out = new FileOutputStream(bkFile);                    // byte[] b = new byte[1024 * 5]; // 5KB                    // int len;                    // while ((len = in.read(b)) != -1) {                    // out.write(b, 0, len);                    // }                    // out.flush();                    // in.close();                    // out.close();                    // 内容流读                    AssetFileDescriptor afd = getContentResolver()                            .openAssetFileDescriptor(                                    Uri.parse("content://com.h3c.test/h3c.txt"),                                    "wr");                    OutputStream out = afd.createOutputStream();                    FileInputStream in = new FileInputStream(new File(                            "/mnt/sdcard/h3c2.txt"));                    byte[] b = new byte[1024 * 5]; // 5KB                    int len;                    while ((len = in.read(b)) != -1) {                        out.write(b, 0, len);                    }                    out.flush();                    in.close();                    out.close();                } catch (FileNotFoundException e) {                    e.printStackTrace();                } catch (IOException e) {                    e.printStackTrace();                }            }        });    }}


更多相关文章

  1. android启动后根文件系统分析
  2. 转:Android下文件操作模式(含SDCard的读写)
  3. Android 文件存储--内部存储的例子
  4. Android之再谈文件操作和SDcard读写
  5. android 怎么实现启动页提前加载webView里的内容
  6. android的文件操作。(未整理完成)
  7. android读取assets大于1M文件的解决方法
  8. android 系统文件目录结构
  9. Android 打开文件管理器 获取文件的真实路径

随机推荐

  1. windows系、公司内网环境 如何下载androi
  2. android RXJava2.0(一)
  3. Android属性动画Property Animation系列
  4. Android(安卓)使用ActivityOptions实现Ac
  5. Android模拟器无法保存数据
  6. Activity被系统重启
  7. 【Android】android:padding属性设置对Im
  8. 关于android中的EditView,TextView的图片
  9. android 背景图片设置
  10. Android(安卓)Studio生成javadoc出错的解