android学习笔记—— ”vnd.android-dir/mms-sms “ 在 android api 23 后不再被支持

在Android API 23(即6.0)之后,使用 'vnd.android-dir/mms-sms' 来调起短信应用的方法已不被官方支持,会导致Activity找不到的错误。推荐使用Intent.ACTION_SENDTO来正确调起短信功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

    如题。常有自家app 调起 短信的需求,大部分写法都会如下,但其中这句


<span style="white-space:pre">	</span>smsIntent.setType("vnd.android-dir/mms-sms");

在android 6.0 以下是没问题的,但android 6.0 以后不再被官方支持,就会导致 activity not found,因此无法正常调起短信;删掉那句就好,感觉没啥差别;还有一般调起短信 用 Intent.ACTION_SENDTO;


    private void sendSMS(String phoneNumber, String message) {
        try {
            Intent smsIntent = new Intent(Intent.ACTION_VIEW);
            smsIntent.setData(Uri.parse("smsto:"));
            smsIntent.setType("vnd.android-dir/mms-sms");
            smsIntent.putExtra("address", phoneNumber);
            smsIntent.
<think>我们正在分析Android中的MIME类型定义,特别是`CONTENT_TYPE`参数。用户询问的是`vnd.android.cursor.dir`后面的参数在MIME类型定义中的作用。 根据引用[1]和引用[2]: - 引用[1]提到:目录形式的MIME类型为`vnd.android.cursor.dir/phone`和`vnd.android.cursor.dir/person`。这里`dir`后面的`phone`或`person`是自定义部分。 - 引用[2]提到:对于uri `content://com.example.app.provider/table1`,其MIME类型为`vnd.android.cursor.dir/vnd.com.example.app.provider.table1`。 由此我们可以总结: 1. MIME类型的基本结构为:`vnd.android.cursor.dir/` + 自定义标识符。 2. 自定义标识符通常采用反向域名格式(如`vnd.com.example.app.provider.table1`)以确保唯一性,但也可以使用简单的单词(如`phone`、`person`)[^1][^2]。 作用: - 自定义部分(即`vnd.android.cursor.dir`后面的部分)用于唯一标识数据类型,避免不同应用间的冲突。 - 系统在匹配Intent或处理ContentProvider数据时,会通过完整的MIME类型(包括自定义部分)来确定如何处理数据[^3]。 因此,回答要点: 1. 解释`vnd.android.cursor.dir`是Android定义的表示目录(多行数据)的固定前缀。 2. 后面的参数是自定义的唯一标识符,通常采用反向域名格式,用于指定具体的数据类型(如表名、数据实体名)。 3. 这个自定义部分的作用是确保不同应用提供的数据类型不会冲突,同时让数据使用者能够明确识别数据类型。 同时,根据用户上一次的问题,我们之前已经解释了`CONTENT_TYPE`和`CONTENT_ITEM_TYPE`的区别,所以这次可以聚焦于用户当前的问题:后面的参数的作用。 注意:引用[3]提到MIME类型用于Intent匹配,所以我们可以提及这个自定义部分在Intent过滤中的作用。 回答结构: 1. 首先说明整个MIME类型的结构。 2. 分解两个部分:固定前缀和自定义部分。 3. 详细解释自定义部分的作用(唯一标识、避免冲突、支持系统匹配)。 4. 举例说明(使用引用中的例子)。 最后,生成相关问题。</think>### Android MIME类型定义解析:`vnd.android.cursor.dir`后参数的作用 在Android的MIME类型定义中,`CONTENT_TYPE`参数的结构为: ```java "vnd.android.cursor.dir/vnd.com.example.books" ``` 其中`vnd.android.cursor.dir`后面的参数(示例中的`vnd.com.example.books`)具有关键作用: #### 1. **参数结构分解** ``` vnd.android.cursor.dir / [自定义标识符] │ 固定前缀 │ 开发者定义的唯一标识符 ``` - **固定前缀**:`vnd.android.cursor.dir` -Android系统定义,表示返回**多条数据记录**(目录结构)[^1] - **自定义标识符**:`vnd.com.example.books` - **核心作用区**:开发者定义的数据类型标识 #### 2. **自定义标识符的作用** | 功能 | 说明 | 示例 | |------|------|------| | **唯一性标识** | 全局唯一标识数据类型,避免不同应用间的冲突 | `vnd.com.example.books`<br>`vnd.com.example.users` | | **数据契约定义** | 声明数据类型结构,建立数据提供方和消费方的协议 | 书籍数据需包含`title`、`author`等字段 | | **权限控制** | 结合`ContentProvider`的`authority`实现安全访问 | `content://com.example.provider/books` | | **Intent路由** | 系统通过此标识匹配处理该数据的Activity[^3] | 声明`<intent-filter>`处理特定类型数据 | #### 3. **设计规范(参考Android最佳实践)** ```java // 标准格式:vnd.[公司域名反向].[数据类型] public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.com.example.books"; // 错误示例(缺少反向域名,易冲突) public static final String ERROR_TYPE = "vnd.android.cursor.dir/books"; // 不推荐! ``` - **必须包含反向域名**:如`com.example`确保全局唯一性[^2] - **末尾明确数据类型**:如`books`表示书籍数据实体 - **全小写字母**:遵循MIME类型标准格式 #### 4. **系统处理流程** 当应用请求数据时: ```mermaid graph TD A[ContentResolver.query(uri)] --> B{系统检查MIME类型} B -->|匹配 vnd.android.cursor.dir| C[加载多行数据处理逻辑] B -->|匹配 vnd.android.cursor.item| D[加载单行数据处理逻辑] C --> E[使用Cursor遍历多行数据] D --> F[直接提取单行数据] ``` #### 5. **实际应用场景示例 **数据提供方(ContentProvider)**: ```java @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case ALL_BOOKS: // 路径:/books return "vnd.android.cursor.dir/vnd.com.example.books"; case SINGLE_BOOK: // 路径:/books/# return "vnd.android.cursor.item/vnd.com.example.books"; default: throw new IllegalArgumentException("Unsupported URI"); } } ``` **数据消费方**: ```java // 通过MIME类型判断数据结构 if (getContentResolver().getType(uri).contains("vnd.com.example.books")) { // 知道正在处理书籍数据 if (mimeType.endsWith("dir")) { // 处理书籍集合 } else { // 处理单本书籍 } } ``` > **关键设计原则**:自定义标识符`vnd.com.example.books`本质是**数据契约的数字化表示**,它使系统无需预装特定SDK即可理解: > 1. 数据来自`com.example`域 > 2. 数据结构符合`books`实体的约定 > 3. 支持多应用通过统一协议交互数据[^3]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值