精华内容
下载资源
问答
  • Android11
    万次阅读
    2021-08-24 17:19:12

    注册自己的Activity

    通过mimeType和scheme,可以将自己的Activity与特定格式的内容和协议关联起来,从而用自己的Activity去打开这些内容

    mimeType指的是内容格式,比如是txt,还是doc,还是ppt等

    scheme指的是协议格式,比如是file,还是http等

    
    	<!-- KML预览 -->
    	<activity
    	    android:name=".view_window.kml.KmlPreviewActivity"
    	    android:label="KML查看器">
    	    <intent-filter>
    	        <action android:name="android.intent.action.VIEW" />
    	        <category android:name="android.intent.category.DEFAULT" />
    	        <data
    	            android:mimeType="application/vnd.google-earth.kml+xml"
    	            android:scheme="content" />
    	    </intent-filter>
    	</activity>
    
    

    获得资源URI

    在Activity中通过以下代码,就可以获得打开的资源对应的URI

    
    	//获得资源URI
    	Uri uri = getIntent().getData();
    
    

    微信URI转文件路径

    微信文件的URI,是通过FileProvider分享出去的,我们通过URI,可以获得实际对应的文件位置

    但从Android11开始,由于系统权限管理的力度加强,微信的文件已经存放到私有目录

    所以我们就算能通过URI拿到文件路径,也不能读取这个文件

    只有通过ContentResolver,才能正常访问FileProvider提供的资源

    
    	//通过微信URI解析文件地址
    	public static String uriToFile(Context context, Uri uri) {
    	    //获得ContentResolver,用于访问其它应用数据
    	    ContentResolver resolver = context.getContentResolver();
    	    //获得URI路径
    	    String pathUri = uri.getPath().toLowerCase();
    	    //解析微信文件路径
    	    if (uri.toString().toLowerCase().startsWith("content://com.tencent.mm.external.fileprovider/external/")) {
    	        String file = ProjectFile.getProjectFile("cache/" + Files.getFileName(pathUri));
    	        InputStream is = resolver.openInputStream(uri);
    	        OutputStream os = new FileOutputStream(file);
    	        Streams.write(is, os);
    	        return file;
    	    }
    	    return null;
    	}
    
    
    
    	//将输入流的数据拷贝到输出流
    	public static void write(InputStream is, OutputStream os) {
    	    byte[] buffer = new byte[1024 * 1024];
    	    while (true) {
    	        int len = is.read(buffer);
    	        if (len < 0) break;
    	        os.write(buffer, 0, len);
    	    }
    	    os.flush();
    	    is.close();
    	    os.close();
    	}
    
    
    更多相关内容
  • Android11不用root,访问/Android/data目录

    万次阅读 2022-01-12 20:20:02
    一、存在的问题:Android11无法查看data下的文件 1.打开手机的文件管理器【我的文件】,查看/sdcard/Android/data目录,文件夹为空 二、解决方法 1.下载并安装.apk软件【文件】 链接: 百度...
     
    一、存在的问题:Android11无法查看data下的文件
    1.打开手机的文件管理器【我的文件】,查看/sdcard/Android/data目录,文件夹为空
    二、解决方法
    1.下载并安装.apk软件【文件】
    链接: 百度网盘 请输入提取码  密码: 9fjn
    2.打开【文件】下的/sdcard/Android/data目录,查看文件正常展示
    展开全文
  • Android 11 中增强了对 Android/data 目录的管控,不同的 app 间不能互相访问 Android/data 目录了。 用户在手机的「我的文件」中也看不到 Android/data 目录中的内容。 访问 Android/data 的方式比较多,介绍以下几...

    Android 11 中增强了对 Android/data 目录的管控,不同的 app 间不能互相访问 Android/data 目录了。
    用户在手机的「我的文件」中也看不到 Android/data 目录中的内容。

    访问 Android/data 的方式比较多,介绍以下几种方式。

    方式1:通过 USB 「传输文件」

    在 PC 上,可以看到 Android/data 目录中的内容,所以不用担心无法在 PC 端备份手机中的数据。

    方式2:通过 FilesActivity Shortcut

    需要创建 FilesActivity 的快捷方式,通过 Google 官方的 FilesActivity 访问 Android/data 目录。
    FilesActivity 是 Android 11 中自带的,它在 com.google.android.documentsui 包中, 完整的类名是 com.android.documentsui.files.FilesActivity

    我把创建快捷方式的过程写成了一个 app,名叫 ShortcutHelper 。ShortcutHelper 的主要任务就是在手机的主界面中创建 FilesActivity 的快捷方式。

    所以,需要安装这个 ShortcutHelper apk 文件,下载 ShortcutHelper apk,可以 点击这里(在 github中,目前访问速度较慢), 也可以从下面的百度网盘中下载。

    百度网盘分享(复制「链接」和「提取码」,打开百度网盘 app 可直接下载):
    链接:https://pan.baidu.com/s/1BoHKeQreV-dzmzRunuHRjA
    提取码:8bd7

    源代码在 https://github.com/galian123/ShortcutHelper,放心使用 apk。

    (1)ShortcutHelper 主界面

    在这里插入图片描述
    点击界面中的 button,创建快捷方式:

    在这里插入图片描述

    添加的快捷方式:
    在这里插入图片描述

    (2)FilesActivity 界面,可以看到 Android/data

    点击 FilesActivity 的快捷方式图标,进入 FilesActivity:

    在这里插入图片描述

    进入 Android/data 目录

    在这里插入图片描述

    (3)代码

    源代码在 https://github.com/galian123/ShortcutHelper

    关键代码如下,你也可以放到自己的 apk 中:

        private fun createShortcutFilesActivity() {
            val supported = ShortcutManagerCompat.isRequestPinShortcutSupported(this)
            if (!supported) {
                Toast.makeText(this, "Can not create shortcut!", Toast.LENGTH_LONG).show()
                return
            }
    
            val component = ComponentName(
                "com.google.android.documentsui",
                "com.android.documentsui.files.FilesActivity"
            )
            val shortcutIntent = Intent()
            shortcutIntent.component = component
            shortcutIntent.action = "android.intent.action.MAIN"
            shortcutIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
    
            try {
                val activityInfo = packageManager.getActivityInfo(component, PackageManager.MATCH_ALL)
            } catch (e: Exception) {
                Toast.makeText(this, "FilesActivity not exists.", Toast.LENGTH_LONG).show()
                return
            }
    
            val shortcut = ShortcutInfoCompat.Builder(this, "id1")
                .setShortLabel("FilesActivity")
                .setLongLabel("Open FilesActivity")
                .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher))
                .setIntent(shortcutIntent)
                .build()
    
            ShortcutManagerCompat.requestPinShortcut(this, shortcut, null)
        }
    

    方式3: 通过 ZArchiver (包名 ru.zdevs.zarchiver,不是应用宝中的那个)

    ZArchiver apk 下载,点击这里

    百度网盘分享(复制「链接」和「提取码」,打开百度网盘 app 可直接下载):
    链接:https://pan.baidu.com/s/1UkLzLM0COASI8oym2XIJhw
    提取码:i2hy

    (全文完)

    展开全文
  • 1.申请android/data的访问权限 使用intent 跳转系统文件管理器到 android/data 并同意你的应用访问这个文件夹 这里是代码 Uri uri1 = Uri.parse("content://...

     

    1.申请android/data的访问权限

    使用intent 跳转系统文件管理器到 android/data 并同意你的应用访问这个文件夹

    这里是代码

     Uri uri1 = Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata");
                    Intent intent1 = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
                    intent1.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                            | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
                            | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
                    intent1.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri1);
                    startActivityForResult(intent1, 11);

    这里的url 是我自己在旧安卓使用文件管理器选择android/data返回的uri 同理 传递这个uri 给文件管理器 自然也会跳转到这文件夹 如果不传递uri 系统文件管理器仍然无法显示 android/data

    如果授权完成 会是这样

    后续的检测是否授权android/data 就自行查看谷歌文档吧

    2.使用uri 访问 android/data 的文件

    如果你现在有一个文件的path 那么这样做可以转为可以访问的uri

    String[] paths = path.replaceAll("/storage/emulated/0/Android/data", "").split("/");
            StringBuilder stringBuilder = new StringBuilder("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3AAndroid%2Fdata");
            for (String p : paths) {
                if (p.length() == 0) continue;
                stringBuilder.append("%2F").append(p);
            }
            return Uri.parse(stringBuilder.toString());

    这个uri 是android/data里的文件的uri 那么现在你可以使用DocumenFile 访问这个文件

    具体的DocumentFile 用法可以谷歌下

    3.使用ContentResolver 访问文件

    如果你的对象是一个文件夹 并且你想要访问这文件夹的文件 那么可以使用ContentResolver.query这个方法

    DocumentsContract.buildChildDocumentsUriUsingTree(dirUri, DocumentsContract.getDocumentId(dirUri));

    使用这个把uri 转为 resolver 可处理的uri

    然后使用 query查询

    resolver.query(childrenUri, new String[]{DocumentsContract.Document.COLUMN_DOCUMENT_ID}, null, null, null);

    主要是为了获取DocumentId 用于获取子文件的uri

    这个方法是SQL 的方法 当然就可以使用SQL 的语句 可以自行谷歌这个文档

    这里是获取子文件的uri

    while (cursor.moveToNext()) {
                String documentId = cursor.getString(0);
                Uri uri = DocumentsContract.buildDocumentUriUsingTree(dirUri, documentId);
    }

    如果可以的话我建议 在此之前判断 resolver.query 返回的 cursor 对象是否是null

    这样子我们就再次获取了子文件的uri 了

    那么DocumentFile 就能再次派上了用场

    DocumentFile documentFile1=DocumentFile.fromSingleUri(context,uri);

    DocumentFile 为我们提供了判断是否是 文件夹 文件的方法

    如果是文件夹我们可以再次执行这样得循环 如果是文件 我们可以获取大小等

    由于清浊并不需要读取文件内容和修改内容 所以这两个怎么做 我并没有做了 当然谷歌的文档说了可以使用I/O 读取 就跟普通的File 操作没区别了到这

    4.末

    这种方法并不是新方法 只是在安卓11 可以用罢了 早在之前读取联系人等 就是用的这种方法 安卓5.0开始就有了这种读取方法 不过这种方法目前就我看来有一点问题 速度缓慢 容易出现问题 具体问题我已经遇到 在某种情况下会抛出各种exception 给你 当然就需要你catch 一下了

    后续的问题再说吧 或许也有其他方法读取 代码并不是原创都是来自谷歌提供的文档

     

     

     

     

    参考:https://www.zhihu.com/question/420023759/answer/1705644689

    展开全文
  • 微信分享朋友圈报错 分享异常 Android 11及以上系统的手机需要使用FileProvider方式分享 项目集成了友盟的分享,在Android 11系统手机上,微信分享朋友圈失败: 集成时以按文档配置了FileProvider,具体步骤: ...
  • Android11文件管理权限申请

    千次阅读 2021-12-15 17:06:13
    Android 11文件管理权限申请,为什么需要这个权限,因为在Android 11后,无法直接在SDcard根目录写文件,Android 11之后要使用分区存储,但是分区存储使用起来很麻烦,所以可以申请文件管理权限,这样就可以随意读写...
  • 推荐在Android11及以上版本使用Storage Access Framework (SAF)操作文件 注意,只可以在Android11及以上版本中使用 /** * Android 11 及以上选择文件导出 */ private static final int REQUEST_CODE_ANDRO
  • 那么在Android11上,就需要做一点改变了。 我们来看看一下获取应用列表的代码,会不会和你的很相似 List<ApplicationInfo> allApps = getPackageManager().getInstalledApplications(0); for(ApplicationInfo ...
  • android 百度地图定位当前位置及POI搜索(源码)

    千次下载 热门讨论 2015-01-11 01:59:25
    它是android使用V2_4_1版本显示百度地图,同时搜索城市定位到该城市地图,输入关键字能显示POI感兴趣的内容,并添加覆盖物标注出来,如KTV或北京的大学。同时包括定位当前位置,通过LocSDK中函数实现,免费资源希望...
  • Android通讯录管理(获取联系人、通话记录、短信消息),需要的打包带走
  • Android 开机自启动应用

    千次下载 热门讨论 2012-11-29 20:37:48
    Android 开机自启动应用, BOOT_COMPLETED
  • Android串口通信(Android Studio)

    千次下载 热门讨论 2017-12-21 15:20:53
    Android串口通信(Android Studio) serial Port 简单的demo 好久之前整的
  • 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。 2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行 3. 使用mm命令来编译,生成的apk...
  • Android串口通讯SerialPort(使用篇)

    万次阅读 热门讨论 2022-03-22 10:20:00
    1.什么是串口? 在不会使用串口通讯之前,暂且可以把它理解为“一个可通讯的口”;... implementation 'com.github.licheedev:Android-SerialPort-API:2.0.0' } 2.)低版本的 gradle在Project 中的 build....
  • android网络相关权限

    万次阅读 2020-11-23 13:04:30
    uses-permission android:name="android.permission.INTERNET"> </uses-permission> <!-- 允许访问网络状态的权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_...
  • Android框架揭秘.pdf

    千次下载 热门讨论 2015-06-19 15:32:26
    Android框架揭秘》通过对Android系统源代码的分析,主要介绍Android框架的初始化过程及主要组件的工作原理。作者直接分析和整理了Android框架的主要源代码,并详细讲解了理解框架工作原理所需的各种基础知识和构成...
  • 这个是通知栏框架(Notificaiton)的全面学习,里面把大概所有的情况都列了出来,通过一个DEMO让你了解它的大致所有使用过程。 可以通过以下博文进行配套了解(有效果图): ...
  • [14本经典Android开发教程]-11-Android系统移植技术详解 -------------------------------------------------- (1)安装如下软件包 sudo apt-get install git-core sudo apt-get install gnupg sudo apt-get install...
  • Android属性android:priority的使用姿势

    万次阅读 2017-11-13 09:57:19
    android:priority
  • Android Layout 布局属性全解

    万次阅读 多人点赞 2018-05-30 16:17:34
    Android &nbsp;Layout 布局属性全解 Android有基本Layout:FrameLayout,LinearLayout,TableLayout,RelativeLayout,AbsoluteLayout。android开发者谷歌文档...
  • Android Studio实战 快速、高效地构建Android应用

    千次下载 热门讨论 2016-09-06 11:01:24
    Android Studio实战 快速、高效地构建Android应用 全面涵盖关于Android Studio及其庞大工具生态系统的内容,包括Git和Gradle:除了介绍Android Studio与Git(用于源代码管理)和Gradle(一款构建及测试工具)的无缝...
  • Android手机获取imei

    万次阅读 2019-09-06 13:56:07
    不能直接用manager.getDeviceId()的原因:https://blog.csdn.net/zichuanzhu/article/details/54693687 /** * * @param context * @return */ @SuppressLint("MissingPermission") public s...
  • AndroidStudio主题样式

    千次下载 热门讨论 2015-10-21 09:15:25
    AndroidStudio将成为开发Android的主流,如此利器怎能没一款好看的主题样式,这是一款不错主题样式
  • [14本经典Android开发教程]-7-Android编程入门教程 -------------------------------------------------- 本文为以前已经使用Java编程并想开始为Android平台开发的开发者编写。我试着尽可能地多的"展开",在合适的每...
  • Android各版本对应的SDK版本...Android 11.0 30 (Android 11) Android 10.0 29 (Android Q) Android 9.0 28 Pie (Android P) Android 8.1 27 Oreo(Android O) Android 8.0 26 Oreo(Android O)(奥利奥) Android 7.1...
  • Android support.v7包

    万次下载 热门讨论 2015-04-14 20:28:30
    Android support.v7包
  • (模拟器中的截图,Android原生的状态) 修改后,横屏状态的下拉通知栏,宽度铺满屏幕。(真实设备截图, 修改后刷机效果) 2 找到这部分的相关布局。 SystemUI下拉通知栏的布局为 super_status_bar.xml ...
  • android eclipse 64位下载

    千次下载 热门讨论 2016-11-16 10:48:29
    我上传的是下载连接,复制连接可直接下载
  • “此应用专为旧版Android打造。拒绝权限可能导致其无法运行”,然后关闭权限以后启动APP检查不到没有开启的权限?这是什么情况,新写的demo测试又没有这个问题。。
  • Android Gradle plugin requires Java 11 问题解决

    万次阅读 多人点赞 2021-04-24 02:37:32
    AGP 7.0.0-alpha02起需要使用Java 11 当Java版本不正确时,Gradle的sync阶段回报错如下: An exception occurred applying plugin request [id: '... > Android Gradle plugin requires Java 11 to run. You

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,804,376
精华内容 1,521,750
关键字:

Android11