【安卓学习之常见问题】android路径及文件问题

█ 【安卓学习之常见问题】android路径及文件问题


█ 系列文章目录

提示:这里是收集了安卓学习之常见问题的相关文章


█ 文章目录


█ 读前说明

  • 本文通过学习别人写demo,学习一些课件,参考一些博客,’学习相关知识,如果涉及侵权请告知
  • 本文只简单罗列相关的代码实现过程
  • 涉及到的逻辑以及说明也只是简单介绍,主要当做笔记,了解过程而已 

█ android 文件系统

⚡️ 1.Android 使用的文件系统类似于其他平台上基于磁盘的文件系统
应用专属存储空间:存储仅供应用使用的文件,可以存储到内部存储卷中的专属目录或外部存储空间中的其他专属目录。使用内部存储空间中的目录保存其他应用不应访问的敏感信息。
共享存储:存储您的应用打算与其他应用共享的文件,包括媒体、文档和其他文件。
⚡️ 2.特点

应用专属文件
不用权限
内部存储空间
其他应用不可访问
/data/user/0/
即 /data/data/
#1.使用 getFilesDir() 或 getCacheDir() 方法,
如:/data/user/0/包名/files
#2.自己访问不需要任何权限,其他应用不可访问
#3.卸载应用时,自动移除文件
外部存储空间
其他应用可访问
/storage/emulated/0/
即 /sdcard/
#1.使用 getExternalFilesDir() 或 getExternalCacheDir() 方法,
如:/storage/emulated/0/Android/data/包名/files
#2.自己访问不需要任何权限,其他应用可访问(需要权限)
#3.卸载应用时,自动移除文件
共享的媒体文件
需要权限
外部存储空间
其他应用可访问
/storage/emulated/0/
即 /sdcard/
#1.使用 MediaStore API 方法,
如:/data/user/0/com.bx.share/files
#2.需要 权限,其他应用可访问
READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE
#3.卸载应用时,文件保留
其他文件类型
需要权限
外部存储空间
其他应用可访问
/storage/emulated/0/
即 /sdcard/
#1.通过系统文件选择器访问,
如:/storage/emulated/0/Android/data/com.bx.share/files
#2.访问不需要任何权限,其他应用可访问
#3.卸载应用时,文件保留
共享单个文件需要与其他应用共享特定文件,请使用 FileProvider API。

在这里插入图片描述

【/sdcard】 等价于 【/storage/emulated/0/】内部存储设备
【/data/data/包名】 等价于 【/data/user/0/包名】
【/data/media/0】 等价于 【/storage/emulated/0/】
【/mnt/sdcard】 等价于 【/storage/emulated/0/】
【/mnt/user/0/primary】 等价于 【/storage/emulated/0/】
【/mnt/shared/Pictures】 等价于 【/storage/emulated/0/Pictures】 相册

⚡️ 3.测试
在这里插入图片描述
参考代码:

Log.e("test", "-------------AbsolutePath--------------------");
Log.e("test", "Environment.getDataDirectory() = " + Environment.getDataDirectory().getAbsolutePath() + "   -------没权限,如创建文件夹");
Log.e("test", "Environment.getRootDirectory() = " + Environment.getRootDirectory().getAbsolutePath() + "   -------没权限,如创建文件夹");
Log.e("test", "Environment.getExternalStorageDirectory() = " + Environment.getExternalStorageDirectory().getAbsolutePath() + "   -------该方法过时,外部存储空间");// android 10(Q)可能读到空
Log.e("test", "getExternalFilesDir() = " + getExternalFilesDir(null).getAbsolutePath() + "   -------外部存储空间");
Log.e("test", "getExternalFilesDir(\"Music\") = " + getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath() + "   -------外部存储空间");
Log.e("test", "getCacheDir() = " + getCacheDir().getAbsolutePath() + "   -------内部存储空间");
Log.e("test", "getFilesDir() = " + getFilesDir().getAbsolutePath() + "   -------内部存储空间");
Log.e("test", "getDatabasePath(\"appSql\") = " + getDatabasePath("appSql").getAbsolutePath() + "   -------内部存储空间");

运行结果:

E/test: -------------AbsolutePath--------------------
E/test: Environment.getDataDirectory() = /data   -------没权限,如创建文件夹
E/test: Environment.getRootDirectory() = /system   -------没权限,如创建文件夹
E/test: Environment.getExternalStorageDirectory() = /storage/emulated/0   -------该方法过时,外部存储空间
E/test: getExternalFilesDir() = /storage/emulated/0/Android/data/com.bx.share/files   -------外部存储空间
E/test: getExternalFilesDir("Music") = /storage/emulated/0/Android/data/com.bx.share/files/Music   -------外部存储空间
E/test: getCacheDir() = /data/user/0/com.bx.share/cache   -------内部存储空间
E/test: getFilesDir() = /data/user/0/com.bx.share/files   -------内部存储空间
E/test: getDatabasePath("appSql") = /data/user/0/com.bx.share/databases/appSql   -------内部存储空间

█ new File()的路径

3.测试

在这里插入图片描述

参考代码:

Log.e("test", "-------------new File(String parent, String child)--------------------");
Log.e("test", "new File(\"mFileName\", \"11\") =" + new File("mFileName", "11").getAbsolutePath());
Log.e("test", "new File(\"/mFileName\", \"22\") =" + new File("/mFileName", "22").getAbsolutePath());
Log.e("test", "new File(\"mFileName/\", \"33\") =" + new File("mFileName/", "33").getAbsolutePath());
Log.e("test", "new File(\"/mFile/Name/\", \"4/4\") =" + new File("/mFile/Name/", "4/4").getAbsolutePath());
Log.e("test", "new File(\"mFileName\", \"55\") =" + new File("mFileName", "55").getAbsolutePath());
Log.e("test", "new File(\"mFileName\", \"66\") =" + new File("mFileName", "66").getAbsolutePath());

运行结果:

E/test: -------------new File(String parent, String child)--------------------
E/test: new File("mFileName", "11") =/mFileName/11
E/test: new File("/mFileName", "22") =/mFileName/22
E/test: new File("mFileName/", "33") =/mFileName/33
E/test: new File("/mFile/Name/", "4/4") =/mFile/Name/4/4
E/test: new File("mFileName", "55") =/mFileName/55
E/test: new File("mFileName", "66") =/mFileName/66

█ Intent.ACTION_SEND 文件分享

参考代码:

   File shareFile = new File(mDirName, mFileName);
   Uri uri;
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
       uri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", shareFile);
   } else {
       uri = Uri.fromFile(shareFile);
   }
   intent.putExtra(Intent.EXTRA_STREAM, uri);
   intent.setType("*/*");
  List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(intent, 0);
  if (!resInfo.isEmpty()) {
      List<Intent> targetedShareIntents = new ArrayList<Intent>();
      for (ResolveInfo info : resInfo) {
          ActivityInfo activityInfo = info.activityInfo;
          Log.e("activityInfo", "packageName = "+activityInfo.packageName+",name = "+activityInfo.name);
         if (!activityInfo.packageName.contains("tencent")) {// 支持微信、qq分享
             continue;
         }
          Intent targeted = new Intent(Intent.ACTION_SEND);
          targeted.addCategory(Intent.CATEGORY_DEFAULT);
          targeted.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          targeted.putExtra(Intent.EXTRA_STREAM, uri);
          targeted.setType("*/*");
          targeted.setPackage(activityInfo.packageName);
          targetedShareIntents.add(targeted);
      }
      Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(1), "选择分享APP");
      chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[] {}));
      startActivity(chooserIntent);
  }

运行结果:

E/test: -------------new File(String parent, String child)--------------------
E/test: new File("mFileName", "11") =/mFileName/11
E/test: new File("/mFileName", "22") =/mFileName/22
E/test: new File("mFileName/", "33") =/mFileName/33
E/test: new File("/mFile/Name/", "4/4") =/mFile/Name/4/4
E/BxShare: new File("mFileName", "55") =/mFileName/55
E/test: new File("mFileName", "66") =/mFileName/66

参考代码:

运行结果:

// 蓝牙
E/activityInfo: packageName = com.android.bluetooth,name = com.android.bluetooth.opp.BluetoothOppLauncherActivity
// 短信
E/activityInfo: packageName = com.android.mms,name = com.android.mms.ui.ComposeMessageRouterActivity
// 用户反馈
E/activityInfo: packageName = com.miui.bugreport,name = com.miui.bugreport.ui.FeedbackActivity
// 添加到我的收藏
E/activityInfo: packageName = com.miui.personalassistant,name = com.miui.personalassistant.collection.ShareRouteActivity
// 学习强国
E/activityInfo: packageName = cn.xuexi.android,name = com.alibaba.android.rimet.biz.XuexiSchemeTransferActivity
// 钉钉
E/activityInfo: packageName = com.alibaba.android.rimet,name = com.alibaba.android.rimet.biz.BokuiActivity
// 电子邮件
E/activityInfo: packageName = com.android.email,name = com.kingsoft.mail.compose.ComposeActivity
// 高德地图
E/activityInfo: packageName = com.autonavi.minimap,name = com.autonavi.map.activity.NewMapActivity
// 转发到百度动态
E/activityInfo: packageName = com.baidu.searchbox,name = com.baidu.searchbox.systemshare.SystemShareToUGC
// 百度识图
E/activityInfo: packageName = com.baidu.searchbox,name = com.baidu.searchbox.push.systemshare.SystemShareDispatcherActivity
// 支付宝二维码识别
E/activityInfo: packageName = com.eg.android.AlipayGphone,name = com.alipay.mobile.quinox.splash.ShareScanQRDispenseActivity
// 支付宝
E/activityInfo: packageName = com.eg.android.AlipayGphone,name = com.alipay.mobile.quinox.splash.ShareDispenseActivity
// 快手极速版
E/activityInfo: packageName = com.kuaishou.nebula,name = com.yxcorp.gifshow.activity.UriRouterActivity
// 便签
E/activityInfo: packageName = com.miui.notes,name = com.miui.notes.ui.activity.EditActivity
// 网易邮箱大师
E/activityInfo: packageName = com.netease.mail,name = com.netease.mobimail.activity.LaunchComposeActivity
// 今日头条极速版
E/activityInfo: packageName = com.ss.android.article.lite,name = com.android.bytedance.search.SearchActivity
// 抖音
E/activityInfo: packageName = com.ss.android.ugc.aweme,name = com.ss.android.ugc.aweme.share.SystemShareActivity
// 拍立淘(淘宝)
E/activityInfo: packageName = com.taobao.taobao,name = com.etao.feimagesearch.IrpActivity
// 去淘宝搜索(淘宝)
E/activityInfo: packageName = com.taobao.taobao,name = com.taobao.search.sf.MainSearchResultActivity
// 淘宝(淘宝)
E/activityInfo: packageName = com.taobao.taobao,name = com.tmall.wireless.module.search.searchResult.TMSearchResultActivity
// 发给给好友(微信)
E/activityInfo: packageName = com.tencent.mm,name = com.tencent.mm.ui.tools.ShareImgUI
// 添加到微信收藏(微信)
E/activityInfo: packageName = com.tencent.mm,name = com.tencent.mm.ui.tools.AddFavoriteUI
// 发送到朋友圈(微信)
E/activityInfo: packageName = com.tencent.mm,name = com.tencent.mm.ui.tools.ShareToTimeLineUI
// 发送给好友(qq)
E/activityInfo: packageName = com.tencent.mobileqq,name = com.tencent.mobileqq.activity.JumpActivity
// 发送到我的电脑(qq)
E/activityInfo: packageName = com.tencent.mobileqq,name = com.tencent.mobileqq.activity.qfileJumpActivity
// 面对面快传(免流量)(qq)
E/activityInfo: packageName = com.tencent.mobileqq,name = cooperation.qlink.QlinkShareJumpActivity
// 保存到QQ收藏(qq)
E/activityInfo: packageName = com.tencent.mobileqq,name = cooperation.qqfav.widget.QfavJumpActivity
// 保存到悟空遥控器
E/activityInfo: packageName = com.wukongtv.wkremote.client,name = com.wukongtv.wkremote.client.pushscreen.PushScreenForShareActivity
// 扫一扫
E/activityInfo: packageName = com.xiaomi.scanner,name = com.xiaomi.scanner.app.ScanActivity
// 米家打印
E/activityInfo: packageName = com.xiaomi.smarthome,name = com.xiaomi.smarthome.printer.SendPrintActivity
// 喜马拉雅
E/activityInfo: packageName = com.ximalaya.ting.android,name = com.ximalaya.ting.android.host.activity.MainActivity
// 拼多多
E/activityInfo: packageName = com.xunmeng.pinduoduo,name = com.xunmeng.pinduoduo.share.system.GalleryShareActivity
// 蓝牙
E/activityInfo: packageName = com.android.bluetooth,name = com.android.bluetooth.opp.BluetoothOppLauncherActivity
// 短信
E/activityInfo: packageName = com.android.mms,name = com.android.mms.ui.ComposeMessageActivity
// Android Beam
E/activityInfo: packageName = com.android.nfc,name = com.android.nfc.BeamShareActivity
// X浏览器
E/activityInfo: packageName = com.mmbox.xbrowser,name = com.mmbox.xbrowser.BrowserActivity

PS:不同手机(android系统不一样),同样是短信,也会有所差异:

红米手机其他手机
短信com.android.mms.ui.ComposeMessageRouterActivitycom.android.mms.ui.ComposeMessageActivity

█ 其他

在这里插入图片描述


█ 相关资料

提示:这里是参考的相关文章

  1. 数据和文件存储概览 | Android 开发者 | Android Developers

█ 免责声明

博主分享的所有文章内容,部分参考网上教程,引用大神高论,部分亲身实践,记下笔录,内容可能存在诸多不实之处,还望海涵,本内容仅供学习研究使用,切勿用于商业用途,若您是部分内容的作者,不喜欢此内容被分享出来,可联系博主说明相关情况通知删除,感谢您的理解与支持!

提示:转载请注明出处:
https://blog.csdn.net/ljb568838953/article/details/118405414

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值