我们知道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. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. Android(安卓)读取资源文件实例详解
  4. android启动后根文件系统分析
  5. Android系统下如何在程序中对XML里面元素进行赋值
  6. 转:Android下文件操作模式(含SDCard的读写)
  7. 【Android】如何用MediaPlayer实现一个简单的音视频播放器
  8. android > android 发布各大市场
  9. Android下读取logcat的信息

随机推荐

  1. android中获取context的多种方法的区别(th
  2. android 加载图片的三种方式
  3. Android(安卓)(ImageLoader、Fresco、Gild
  4. 谷歌、摩托罗拉被要求向苹果提供有关Andr
  5. Android开发两个例子:多点触控技术&桌面快
  6. Android中观察者模式(Observable)的理解
  7. Android原生页面Activity与React页面相互
  8. Android的图片缓存ImageCache
  9. Android开发学习笔记-关于Android的消息
  10. android 启动线程注意的问题