Android通过ContentProvider传输文件
16lz
2021-01-23
我们知道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(); } } }); }}
更多相关文章
- android启动后根文件系统分析
- 转:Android下文件操作模式(含SDCard的读写)
- Android 文件存储--内部存储的例子
- Android之再谈文件操作和SDcard读写
- android 怎么实现启动页提前加载webView里的内容
- android的文件操作。(未整理完成)
- android读取assets大于1M文件的解决方法
- android 系统文件目录结构
- Android 打开文件管理器 获取文件的真实路径