提供的 URI 方案“file”无效;应为“http”,该怎么解决

提供的 URI 方案“file”无效;应为“http”,该怎么解决,第1张

/
根据Uri获取绝对路径,解决Android44以上版本Uri转换
@param activity
@param imageUri
@author yaoxing
@date 2014-10-12
/
@TargetApi(19)
public static String getImageAbsolutePath(Activity context, Uri imageUri) {
if (context == null || imageUri == null)
return null;
if (androidosBuildVERSIONSDK_INT >= androidosBuildVERSION_CODESKITKAT && DocumentsContractisDocumentUri(context, imageUri)) {
if (isExternalStorageDocument(imageUri)) {
String docId = DocumentsContractgetDocumentId(imageUri);
String[] split = docIdsplit(":");
String type = split[0];
if ("primary"equalsIgnoreCase(type)) {
return EnvironmentgetExternalStorageDirectory() + "/" + split[1];
}
} else if (isDownloadsDocument(imageUri)) {
String id = DocumentsContractgetDocumentId(imageUri);
Uri contentUri = ContentUriswithAppendedId(Uriparse("content://downloads/public_downloads"), LongvalueOf(id));
return getDataColumn(context, contentUri, null, null);
} else if (isMediaDocument(imageUri)) {
String docId = DocumentsContractgetDocumentId(imageUri);
String[] split = docIdsplit(":");
String type = split[0];
Uri contentUri = null;
if ("image"equals(type)) {
contentUri = MediaStoreImagesMediaEXTERNAL_CONTENT_URI;
} else if ("video"equals(type)) {
contentUri = MediaStoreVideoMediaEXTERNAL_CONTENT_URI;
} else if ("audio"equals(type)) {
contentUri = MediaStoreAudioMediaEXTERNAL_CONTENT_URI;
}
String selection = MediaStoreImagesMedia_ID + "=";
String[] selectionArgs = new String[] { split[1] };
return getDataColumn(context, contentUri, selection, selectionArgs);
}
} // MediaStore (and general)
else if ("content"equalsIgnoreCase(imageUrigetScheme())) {
// Return the remote address
if (isGooglePhotosUri(imageUri))
return imageUrigetLastPathSegment();
return getDataColumn(context, imageUri, null, null);
}
// File
else if ("file"equalsIgnoreCase(imageUrigetScheme())) {
return imageUrigetPath();
}
return null;
}

public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = null;
String column = MediaStoreImagesMediaDATA;
String[] projection = { column };
try {
cursor = contextgetContentResolver()query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursormoveToFirst()) {
int index = cursorgetColumnIndexOrThrow(column);
return cursorgetString(index);
}
} finally {
if (cursor != null)
cursorclose();
}
return null;
}

/
@param uri The Uri to check
@return Whether the Uri authority is ExternalStorageProvider
/
public static boolean isExternalStorageDocument(Uri uri) {
return "comandroidexternalstoragedocuments"equals(urigetAuthority());
}

/
@param uri The Uri to check
@return Whether the Uri authority is DownloadsProvider
/
public static boolean isDownloadsDocument(Uri uri) {
return "comandroidprovidersdownloadsdocuments"equals(urigetAuthority());
}

/
@param uri The Uri to check
@return Whether the Uri authority is MediaProvider
/
public static boolean isMediaDocument(Uri uri) {
return "comandroidprovidersmediadocuments"equals(urigetAuthority());
}

/
@param uri The Uri to check
@return Whether the Uri authority is Google Photos
/
public static boolean isGooglePhotosUri(Uri uri) {
return "comgoogleandroidappsphotoscontent"equals(urigetAuthority());
}

的“
“/ A> 我写:档案文件=新的文件(新URI(“\ \ \ \ 1921681119 \ \ F:\ \ abctxt”)); 但错误:计划名称中有非法字符索引0:\ \ 1921681119 \ F:\ abctxt

朋友,既然要扫描手机中的所有信息,而不一定全在SD卡中的,所以有的cursor返回null,有的却不为null。那么我觉得你这个问题就是判断cursor是否为null即可啊,为null提示用户就可以了啊。 也可以吧软件设计成必须要有sd卡,否则直接提示用户插入sd卡。 EnvironmentgetExternalStorageState()equals( EnvironmentMEDIA_MOUNTED); 这是判断sd卡是否存在并可用的语句,如果可用就继续你的读逻辑,如果不可用,直接对话框或者吐司提示。 纯手打,谢谢采纳,祝开发愉快。

将URI类型"file:/D:/runtime-EclipseApplication/ffff"转换成String类型,直接ToStringURIToString就行了。 string是C++、java等编程语言中的字符串。String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是

最近一直被Android10相关的适配搞得焦头烂额,之前也听说过android10中的所有的视频,音频以及等资源为了统一的管理,统一放在一个共有的文件下,也就是所谓的沙箱。看了一下其他人写的文章,也提供了一种简单粗暴的方式也就是在清单文件application下配置#android:requestLegacyExternalStorage="true"#,但如果android11出来又得适配了,android11是禁止除了共有文件夹下新建视频,音频以及等文件。不然就会报找不到文件相关的错误,好了说到底我们还是得花点时间去适配android10以上的沙箱适配。

进入正题,接下来我们就来适配Android10相关的拍照以及选择相册并兼容android10以下的绝大部分的适配。

进入系统相册的 *** 作都是一样的这里就不赘述:

主要的还是要对返回的data进行处理,也就是把uri转换成文件File的路径path

当然了拍照和位图Bitmap相关的适配是一样的。

70以上Android版本的路径配置
第一步

@xml/file_camera_paths 文件配置

拍照首先需要申请拍照权限
申请完后调用camera就可以拍照,拍照主要就是在调用相机的时需要自己去配置文件存储路径。

回调处理这里我就不赘述了 主要是对Android10以上关于配置相关的处理
既然关于Android 10那么我们也讲一下关于定位方面的适配,Android10以上需要在清淡文件中添加一个新的定位权限

方法/步骤
1
如下图所示,需要根据URL地址获取加载到图中Anroid机器人所在的位置,这是运行前的效果:
2
首先需根据URL地址获取,如下所示,urladdr即为地址,返回Drawable对象:
//download image from network using @urladdress
private Drawable loadImageFromNetwork(String urladdr) {
// TODO Auto-generated method stub
Drawable drawable = null;
try{
//judge if has picture locate or not according to filename
drawable = DrawablecreateFromStream(new URL(urladdr)openStream(), "imagejpg");
}catch(IOException e){
Logd("test",egetMessage());
}
if(drawable == null){
Logd("test","null drawable");
}else{
Logd("test","not null drawable");
}
return drawable;
}
3
获取到后,需要更新主线程UI资源,考虑到时间以及界面反应延迟等,所以采用线程加以处理,如下图所示:
// image
new Thread(new Runnable(){
Drawable drawable = loadImageFromNetwork(urladdress);
@Override
public void run(){
//post() is quite important,update pictures in UI main thread
imagepost(new Runnable(){
@Override
public void run(){
//TODO Auto-generated method stub
imagesetImageDrawable(drawable);
}
});
}
//download image from network using @urladdress
private Drawable loadImageFromNetwork(String urladdr) {
// 略(如 1 中所示)
}
})start(); //线程启动
4
说明:在上述示例代码中,image是ImageView类的一个对象,也就是APP中的一个显示图像组件,利用获取到的drawable去更新image,运行效果如下所示:

Java中File file1 = new File("d:\\xxx\\yyy");意思是利用给定字符串的路径创建一个文件。
javaFile类在javaio包下,该类有四个构造方法:
1File(File parent, String child)
根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
2File(String pathname)
通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
3File(String parent, String child)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
4File(URI uri)
通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10545963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存