当前位置: 首页 > news >正文

广州番禺哪个公司建网站比较好网站开发接私单

广州番禺哪个公司建网站比较好,网站开发接私单,用什么软件做商务网站,企业网站app开发平台超级轻量级FilePicker测试没有问题 本文摘录于:https://blog.csdn.net/gitblog_00365/article/details/141449437只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人! 今天真的是发了疯的找文件管理器,因为调用系统自带的文件管理…

超级轻量级FilePicker测试没有问题

本文摘录于:https://blog.csdn.net/gitblog_00365/article/details/141449437只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人!
今天真的是发了疯的找文件管理器,因为调用系统自带的文件管理器老是有问题,所以越调越着急,最后发现还是FilePicker简单好用,代码仓库地址:https://gitcode.com/gh_mirrors/andr/android-filepicker/overview?utm_source=artical_gitcode&index=top&type=card&webUrl
步骤很简单,第一步添加依赖
首先,在你的项目的 build.gradle (Module) 文件中的 dependencies 块添加如下依赖:

implementation 'com.github.angads25:filepicker:1.1.0'

然后在代码黄总增加如下内容(原文内容):

import com.angads25.filepicker.model.FilePath;
import com.angads25.filepicker.view.FilePickerFragment;...// 在某个方法内启动FilePicker
private void chooseFile() {FilePickerFragment filePickerFragment = FilePickerFragment.newInstance();filePickerFragment.setFileType(FilePickerFragment.FILE_TYPE_ALL);filePickerFragment.setOnFilePathSelectedListener(new FilePickerFragment.OnFilePathSelectedListener() {@Overridepublic void onFilePathSelected(List<FilePath> filePaths) {// 处理选择的文件路径for (FilePath fp : filePaths) {Log.d("MyApp", "Selected Path: " + fp.getPath());}}});filePickerFragment.show(getSupportFragmentManager(), "FILE_PICKER");
}

我自己的代码如下:

public void onClickSelectFile(View view) {Toast.makeText(getApplicationContext(), "请选择bin格式文件", Toast.LENGTH_SHORT).show();DialogProperties properties = new DialogProperties();properties.selection_mode = DialogConfigs.SINGLE_MODE;properties.selection_type = DialogConfigs.FILE_SELECT;properties.root = new File("/sdcard");properties.error_dir = new File(DialogConfigs.DEFAULT_DIR);properties.offset = new File(DialogConfigs.DEFAULT_DIR);String[] extensions = {"bin",};properties.extensions = extensions;FilePickerDialog dialog = new FilePickerDialog(OTA_Active.this, properties);dialog.setTitle("请选择bin格式文件");dialog.setDialogSelectionListener(new DialogSelectionListener() {@Overridepublic void onSelectedFilePaths(String[] files) {// files数组包含了用户由应用程序选择的文件路径。String path=files[0];if(path!="") {int start = path.lastIndexOf("/");if (start != -1 ) {FileNameList.add(path.substring(start + 1));FilePathList.add(path);ArrayAdapter<String> array = new ArrayAdapter(OTA_Active.this, android.R.layout.simple_list_item_1, FileNameList);listview.setAdapter(array);OTA_Active.this.runOnUiThread(new Runnable() {@Overridepublic void run() {//此时已在主线程中,可以更新UI了AdapterView.OnItemClickListener onItemClickListener = listview.getOnItemClickListener();if(onItemClickListener!=null){onItemClickListener.onItemClick(listview,null,listview.getCount()-1,0);}}});}}}});dialog.show();}

本章节的源码可以从如下地址下载:https://download.csdn.net/download/chengdong1314/89943454
测试确实可行,使用起来完全没问题,视频操作演示如下:

选择文件操作

挣扎解决自带文件管理器获取不到绝对地址问题

非常无奈按照网上的方法调用系统自带的文件管理器选择文件的时候总会这样返回msf%3A1000038197之类的数据,比如如下:

content://com.android.providers.downloads.documents/document/msf%3A1000038197

本文摘录于:https://cloud.tencent.com/developer/article/2003648只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人!
这里根据上面的文章调用如下函数:

    public static File uriToFileApiQ(Uri uri, Context context) {File file = null;if (uri == null) return file;//android10以上转换if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {file = new File(uri.getPath());} else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {//把文件复制到沙盒目录ContentResolver contentResolver = context.getContentResolver();String displayName = System.currentTimeMillis() + Math.round((Math.random() + 1) * 1000)+ "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(uri));try {InputStream is = contentResolver.openInputStream(uri);File cache = new File(context.getCacheDir().getAbsolutePath(), displayName);FileOutputStream fos = new FileOutputStream(cache);FileUtils.copy(is, fos);file = cache;fos.close();is.close();} catch (IOException e) {e.printStackTrace();}}return file;}

这样调用uriToFileApiQ函数:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK) {Uri uri = data.getData();if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后File fi = uriToFileApiQ(this, uri);path=fi.getPath();} else {//4.4以下下系统调用方法path = getRealPathFromURI(uri);}int index = path.lastIndexOf('.');if (index > 0) {if(!("bin".equals(path.substring(index + 1))))return;}else  return;if(path!="") {int start = path.lastIndexOf("/");if (start != -1 ) {FileNameList.add(path.substring(start + 1));FilePathList.add(path);ArrayAdapter<String> array = new ArrayAdapter(OTA_Active.this, android.R.layout.simple_list_item_1, FileNameList);listview.setAdapter(array);AdapterView.OnItemClickListener onItemClickListener = listview.getOnItemClickListener();if(onItemClickListener!=null){onItemClickListener.onItemClick(listview,null,listview.getCount()-1,0);}}}}}

onActivityResult是这样引起的:

    public void onClickSelectFile(View view) {Toast.makeText(getApplicationContext(), "请选择bin格式文件", Toast.LENGTH_SHORT).show();Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType("*/*");//无类型限制intent.addCategory(Intent.CATEGORY_OPENABLE);startActivityForResult(intent, 1);}

上面的uriToFileApiQ函数是有缺陷的,FileUtils.copy(is, fos);函数报错了,如果改成FileUtils.copy(is.tostring(), fos.tostring());确实编译没错了,但是拷贝到沙盒里面的文件大小是0,拷贝出错!
在这里插入图片描述
无奈啊,我这时候都放弃了,又去本文第一节去尝试了一圈,搞定了自定义文件管理器的问题,但是客户又说一定要自带的资源管理器,可以打开最近的文件,无奈只能够死磕这个问题!!!
最后找呀找,找到这篇文章:https://www.bytezonex.com/archives/b8w3-cvz.html
这里说明了原来的拷贝错误的原因:
Android 10 获取文件路径难题:/document/msf: 解决方案

许多开发者在 Android 10 设备上使用 Intent.ACTION_GET_CONTENT 获取文件路径时,都会遇到返回路径形如 /document/msf: 的情况,令人困惑不已。这并非应用本身的错误,而是 Android 10 为了加强隐私保护而采取的新策略。本文将深入剖析这一变化背后的原因,并提供一套完整的解决方案,帮助你绕过障碍,顺利获取目标文件。

从文件路径到 URI:Android 10 文件访问机制的转变
在 Android 10 之前,应用能够通过文件路径直接访问设备上的绝大多数文件,这种方式虽然便捷,但也存在着巨大的安全隐患,容易造成用户隐私泄露。为了提升系统安全性,Android 10 引入了分区存储机制,限制应用直接访问外部存储空间。

新的机制下,当应用使用 Intent.ACTION_GET_CONTENT 选择文件时,系统不再返回直接的文件路径,而是返回一个 content:// 格式的 URI。这个 URI 指向一个由 MediaStore 管理的中间层,应用无法直接从中获取文件路径,相当于在应用和真实文件之间建立了一道安全屏障。

神秘的 /document/msf: :特殊文件的安全处理
/document/msf: 正是 Android 10 返回的一种特殊 URI,它通常代表着应用选择的并非媒体文件(例如图片、视频),而是其他类型的文件。由于系统无法确定应用如何使用这些文件,为了最大程度地保护用户隐私,系统选择不直接提供文件路径,而是返回这个特殊的 URI,将文件访问权限牢牢掌握在自己手中。

ContentResolver 和 InputStream:突破封锁的利器
想要在 Android 10 上顺利获取文件内容,我们需要借助 Android 系统提供的 ContentResolver 和 InputStream 这两大利器。

操作步骤:

获取 ContentResolver: 通过 context.contentResolver 获取 ContentResolver 实例,相当于获取了与 MediaStore 通信的桥梁。
打开 InputStream: 使用 ContentResolver.openInputStream(uri) 方法,将获取的 content:// URI 传递进去,打开一个指向目标文件的 InputStream,相当于在安全屏障上打开了一条通道,文件内容将通过这条通道流向应用。
读取文件内容: 使用 InputStream 的 read() 方法,如同读取水流一般,将文件内容源源不断地读取出来,供应用使用。
整体思路就是通过InputStream 把数据从外部储存转写到沙盒来,最后修改uriToFileApiQ函数如下:

   public static File uriToFileApiQ(Context context,Uri uri) {File file = null;if(uri == null) return file;//android10以上转换if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {file = new File(uri.getPath());} else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {//把文件复制到沙盒目录ContentResolver contentResolver = context.getContentResolver();
//            String displayName = System.currentTimeMillis()+ Math.round((Math.random() + 1) * 1000)
//                    +"."+ MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(uri));//            注释掉的方法可以获取到原文件的文件名,但是比较耗时Cursor cursor = contentResolver.query(uri, null, null, null, null);String displayName="";if (cursor.moveToFirst()) {displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));}try {InputStream in = contentResolver.openInputStream(uri);File cache = new File(context.getCacheDir().getAbsolutePath(), displayName);FileOutputStream out = new FileOutputStream(cache);//FileUtils.copy(in.toString(), out.toString());int len=-1;byte[] b=new byte[512*1024];while((len=in.read(b))!=-1){out.write(b,0,len);}file = cache;in.close();out.close();} catch (IOException e) {e.printStackTrace();}}return file;}

这里测试到拷贝过来的文件大小就对了,到此问题成功解决!
在这里插入图片描述
本章节的安卓源码从如下地址下载:https://download.csdn.net/download/chengdong1314/89943485
视频操作如下:

http://www.yayakq.cn/news/497962/

相关文章:

  • 富阳网站建设 优帮云国外最开放的浏览器是哪个
  • 粉色做网站背景图片wordpress多域名
  • 免费做app网站有哪些开个微网站需要什么
  • 深圳定制网站制作厂家宁波seo外包代运营
  • 网站建设选择服务器陕西网站建设培训
  • 建设网站企业网上银行天津建站管理系统价格
  • 网站建设管理工作情况的通报百度推广怎么做
  • 酒店手机网站模板珠海市建设工程造价协会网站
  • 做网站前需要准备什么网站推广的主流方法
  • 如何获取网站域名证书app展示网站
  • jsp网站开发四库网站自助建站开发制作
  • 网站背景色代码深圳市点击未来科技网站建设
  • 做网站网页需要多久网站ftp上传工具哪个好用
  • 做网站编辑工作累吗ps图做ppt模板下载网站有哪些内容
  • 成都网站建设sntuu南京网络优化培训
  • 网站的营销推广方案集团网站风格
  • 俄罗斯免费网站推广哪些企业网站做的比较好
  • 扫码支付个人商城网站开发免费怎做视频网站
  • 长沙推广网站网站制作软件是什么
  • 中国五大门户网站dw个人网页模板
  • 家具网站建设比较好的大连高新园区范围
  • 做搜狗pc网站优化沧州高端网站建设
  • 常州个人网站建设考试微网站开发
  • 网站建设人员考核wordpress 搜狐
  • 商贸有限公司网站案例江西省赣州市天气预报
  • 专业的网站开发服务国外免费域名注册平台
  • 青岛网站的优化优惠券网站怎么做代理
  • 做网站要注册公司吗怎么在网站里做宣传
  • 网站里的聊天怎么做青岛城阳 软件网站开发
  • 淘宝客怎么做直播网站吗深圳网站建设 设计首选深圳市