使用ContentProvider在应用程序之间共享文件,openFile()和call()的使用

这个例子的文件是放在assets目录下的,使用openFile()分享时,必须将文件生成到手机或内存卡中。同时,使用call()方法也可以很好的实现共享,返回的文件信息是以byte[]的形式存放在Bundle中的。


AndroidManifest.xml源代码


public class Myprovider extends ContentProvider {

	private final static int FILE_NAME = 1;

	private static final UriMatcher sMatcher;
	static {
		sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		sMatcher.addURI("com.zgl.myprovider", "file/*", FILE_NAME);
	}

	// @Override
	// public AssetFileDescriptor openAssetFile(Uri uri, String mode)
	// throws FileNotFoundException {
	// AssetFileDescriptor afd = null;
	// try {
	// switch (sMatcher.match(uri)) {
	// case FILE_NAME:
	// String filename = uri.getPathSegments().get(1);
	// try {
	// afd = getContext().getAssets().openFd(filename);
	// } catch (IOException e) {
	// e.printStackTrace();
	// }
	// break;
	// default:
	// break;
	// }
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	//
	// return afd;
	// }

	@Override
	public ParcelFileDescriptor openFile(Uri uri, String mode)
			throws FileNotFoundException {
		// 另一个程序使用如下代码获得流InputStream is = resolver.openInputStream(uri);
		ParcelFileDescriptor pfd = null;
		switch (sMatcher.match(uri)) {
		case FILE_NAME:
			String filename = uri.getPathSegments().get(1);
			File file = new File(getContext().getFilesDir(), filename);
			if (!file.exists()) {
				try {
					InputStream in = getContext().getAssets().open(filename);
					BufferedInputStream bis = new BufferedInputStream(in);
					FileOutputStream fos = new FileOutputStream(file);
					int len = 0;
					byte[] b = new byte[1024];
					while ((len = bis.read(b)) != -1) {
						fos.write(b, 0, len);
					}
					fos.flush();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			pfd = ParcelFileDescriptor.open(file,
					ParcelFileDescriptor.MODE_READ_ONLY);
			file.delete();
			break;
		default:
			break;
		}
		return pfd;
	}

	@SuppressLint("NewApi")
	@Override
	public Bundle call(String method, String arg, Bundle extras) {
		Bundle ret_extras = new Bundle();
		if ("getIn".equals(method)) {
			try {
				ret_extras = getIn(extras);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return ret_extras;
	}

	@SuppressLint("NewApi")
	public Bundle getIn(Bundle extras) throws IOException {
		Bundle ret_extras = new Bundle();
		String filename = extras.getString("filename", "");
		try {
			InputStream in = getContext().getAssets().open(filename);
			BufferedInputStream bis = new BufferedInputStream(in);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			byte[] buff = new byte[1024];
			int len = 0;
			while ((len = bis.read(buff)) != -1) {
				baos.write(buff, 0, len);
			}
			byte[] b = baos.toByteArray();
			ret_extras.putByteArray("myBundle", b);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return ret_extras;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		return 0;
	}

	@Override
	public String getType(Uri uri) {
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		return null;
	}

	@Override
	public boolean onCreate() {
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		return null;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		return 0;
	}
}


另一个程序的MainActivity.java代码如下:


public class MainActivity extends Activity {
	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		TextView tv = (TextView) findViewById(R.id.tv);
		ContentResolver resolver = this.getContentResolver();
		// Uri uri =
		// Uri.parse("content://com.zgl.myprovider/file/phoneModel.xml");
		Uri uri = Uri.parse("content://com.zgl.myprovider");
		String filename = "phoneModel.xml";
		try {
			// InputStream in = resolver.openInputStream(uri);
			Bundle extras = new Bundle();
			extras.putString("filename", filename);
			Bundle retBundle = resolver.call(uri, "getIn", null, extras);
			byte[] b = retBundle.getByteArray("myBundle");
			File file = new File(getFilesDir(), filename);
			FileOutputStream fos = new FileOutputStream(file);
			fos.write(b);
			tv.setText(new String(b));
			fos.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}

		// PackageManager pm = getPackageManager();
		// try {
		// PackageInfo pi = pm.getPackageInfo("com.nxp.nfceeapi.service",
		// PackageManager.GET_META_DATA);
		// ApplicationInfo appInfo = pi.applicationInfo;
		// String packageName = appInfo.packageName;
		// String versionName = pi.versionName;
		// int versionCode = pi.versionCode;
		// Toast.makeText(MainActivity.this,
		// "packageName:" + packageName + ";versionName:" + versionName +
		// ";versionCode:" + versionCode,
		// Toast.LENGTH_LONG).show();
		// } catch (NameNotFoundException e) {
		// e.printStackTrace();
		// }

	}
}


特别说明的是,当openAssetFile()和openFile()同时存在时,resolver.openInputStream(uri)将调用openAssetFile()返回InputStream。


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值