这个例子的文件是放在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。