通过主动的方式通知系统我们需要文件列表,要向系统发送广播
sendBroadcast(new Intent(IntentACTION_MEDIA_MOUNTED, Uriparse(“file://”+ EnvironmentgetExternalStorageDirectory())));
然后通过接收器获取系统文列表
public class MediaScannerReceiver extends BroadcastReceiver{
private final static String TAG = ”MediaScannerReceiver”;
@Override
public void onReceive(Context context, Intent intent) {
String action = intentgetAction();
Uri uri = intentgetData();
String externalStoragePath = EnvironmentgetExternalStorageDirectory()getPath();
if (actionequals(IntentACTION_BOOT_COMPLETED)) {
// scan internal storage
scan(context, MediaProviderINTERNAL_VOLUME);
} else {
if (urigetScheme()equals(“file”)) {
// handle intents related to external storage
String path = urigetPath();
if (actionequals(IntentACTION_MEDIA_MOUNTED) &&
externalStoragePathequals(path)) {
scan(context, MediaProviderEXTERNAL_VOLUME);
} else if (actionequals(IntentACTION_MEDIA_SCANNER_SCAN_FILE) &&
path != null && pathstartsWith(externalStoragePath + ”/”)) {
scanFile(context, path);
}
}
}
}
private void scan(Context context, String volume) {
Bundle args = new Bundle();
argsputString(“volume”, volume);
contextstartService(
new Intent(context, MediaScannerServiceclass)putExtras(args));
}
private void scanFile(Context context, String path) {
Bundle args = new Bundle();
argsputString(“filepath”, path);
contextstartService(
new Intent(context, MediaScannerServiceclass)putExtras(args));
}
}
近期在部分安卓手机中获取文件,发现部分安卓手机的uri路径中返回的不是 content://media/extenral/images/media/17766 这种常规类型的 地址
而是返回的是 content://media/extenral/images/media/raw:/storage/emulated/0/Download/my_filepdf 类似这种的地址
这样在咱们常用的获取地址中就会报错了 javalangNumberFormatException' Exception
解决方法
修改isDownloadsDocument(uri) 中的方法按下述方法进行修改就完美解决了
有时候,想实现以下功能:跳转到文件管理器,让用户选择一个文件,并获取用户选择的结果。
跳转到文件管理器可以如下Intent跳转简单实现:
//打开文件管理器
Intent i = new
Intent(IntentACTION_GET_CONTENT);
isetType("file/");
startActivity(i);
为了获取用户选择的结果,最好是startActivityForResult()方法,以便在onActivityResult()中获取用户所选择的结果。
假设当前的需求是让用户选择一张。
Intent i = new Intent(IntentACTION_GET_CONTENT);
isetType("image/");
startActivityForResult(i, MY_REQUEST_CODE);
此时会d出对话框,询问要以什么方式来打开,一般可选项有图库(系统自带的,如果有的话)和文件管理器(如果有的话)。
用户选择了一个文件后,会返回原Activity,在onActivityResult()方法里,可如下 *** 作以判断文件类型。
@Override
protected
void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode ==
PHOTO_REQUEST_CODE)//自定义的一个static final int常量
{
if(resultCode
== RESULT_OK)
{
//得到文件的Uri
Uri
uri = datagetData();
ContentResolver
resolver = getContentResolver();
//ContentResolver对象的getType方法可返回形如content://的Uri的类型
//如果是一张,返回结果为image/jpeg或image/png等
String
fileType =
resolvergetType(uri);
if(fileTypestartsWith("image"))//判断用户选择的是否为
{
//根据返回的uri获取路径
Cursor
cursor = resolverquery(uri,
new
String[]{MediaStoreImagesMediaDATA}, null, null, null);
cursormoveToFirst();
String
path =
cursorgetString(cursorgetColumnIndex(MediaStoreImagesMediaDATA));
//do
anything you want
}
}
}
}
我在网上看到不少童鞋说,获取文件的路径,然后根据后缀名来判断是否为类型。我个人觉得这样比较繁琐而且不太靠谱,可能会漏掉一些后缀名的判断。
所以我采用了上述的方法来判断的类型。其它文件类型可以类似 *** 作。
以上就是关于Android中如何使用代码打开各种类型的文件全部的内容,包括:Android中如何使用代码打开各种类型的文件、android4.4之后怎么根据sd卡中的图片路径path获取图片对应的Uri地址、第五章:Web服务器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)