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