android_android studio - CSDN
android 订阅
安卓是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。但运营收入不及iOS。 [1] 展开全文
安卓是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机、智能手表等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。但运营收入不及iOS。 [1]
信息
更新时间
2019年9月4日 [2]
源码模式
自由及开放源代码软件
发行日期
2008年9月23日
软件许可
Apache License、 GPL等
创始人
安迪·鲁宾(Andy Rubin)
软件语言
C/C++(底层) Java,Kotlin等(应用层)
开发商
Google、开放手持设备联盟
发行商
Google - 谷歌(美国)
软件版本
Android 10(正式版) [2]
软件平台
Google
内核类型
宏内核(Linux内核)
测试版本
Android 11 Developer Preview 3(开发者预览版)
系统家族
类Unix,Linux
软件名称
Android(安卓)
Android系统简介
Android一词的本义指“机器人”,同时也是Google于2007年11月5日 Android logo相关图片(33张) 宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android。Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号,于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根天线,Android小机器人便诞生了。其中的文字使用了Ascender公司专门制作的称之为“Droid ” 的字体。Android是一个全身绿色的机器人,绿色也是Android的标志。颜色采用了PMS 376C和RGB中十六进制的#A4C639来绘制,这是Android操作系统的品牌象徵。有时候,它们还会使用纯文字的Logo。2012年7月美国科技博客网站BusinessInsider评选出二十一世纪十款最重要电子产品,Android操作系统和iPhone等榜上有名。(Android logo 相关图片相册图片来源:)
收起全文
精华内容
参与话题
  • 这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 ...
  • Android编程经典200例

    2020-07-30 23:33:19
    资源名称:Android编程经典200例内容简介:本书通过200个经典实例全面、系统地介绍了Android平台下的软件开发知识,重点突出、涉及面广、实用性强,在实例的讲解过程中还详细分析了开发思路及侧重点,使读者达到...
  • Android Studio 开发详解

    万人学习 2019-12-18 15:09:34
    Android Studio教程,该教材会详细介绍Android Studio如何使用,包括在Windows平台下载安装Android Studio、配置、代码重构、项目调试、jar包管理等。
  • 一、Android简介

    千次阅读 2018-08-14 21:15:22
     从接触Android学习到开发马上就有3年了,讲道理是不是也该算是一个熟练的码农了(啥时候能成大牛啊),但是你问我Android都有哪些技术啊,开发过程中都有什么难点啊,好吧,我还真的不知道从何讲起,所以下定了...

    引言:

            从接触Android学习到开发马上就有3年了,讲道理是不是也该算是一个熟练的码农了(啥时候能成大牛啊),但是你问我Android都有哪些技术啊,开发过程中都有什么难点啊,好吧,我还真的不知道从何讲起,所以下定了决心,准备像各路大牛学习,坚持写博客,整理记录自己的脑子里的知识。都说写博客特别耗费时间,但是时间嘛就像女人的胸,挤挤总是会有的(坏笑)。好,不多多逼逼,下面开始...

    一、Android系统简介

    Android系统:Google公司发布的手机或者平板上的运行系统,现在最新(180814)的系统更新到了9.0吧,世界上4.03之前的系统应该没人再用了,在Android创建新项目的时候,最低版本选择4.03的时候,它就告诉我,这个选项已经含括了世界上100%的终端设备。每次大的升级都有很多新特性,接下来简单记录一下:

    1、Android 5.0

    (1)5.0之前Android系统都是运行在Dalvik虚拟机上,5.0之后运行环境是ART虚拟机,提升了运行速度。

    (2)提出Material Design设计风格来美化界面设计

      (3) .......

    2、Android 6.0

    (1)运行时权限管理

    (2)电量优化

    (3)规范化APP Link

    (4).......

    3、Android 7.0

    (1)新的Notifycations

    (2)多窗体支持(分屏模式)

    (3)随时随地低耗电

    (4)优化大型应用的安装速度

    (5)......

    4、Android 8.0

    (1)TensorFlow Lite 人工智能的尝试

    (2)画中画,在你使用的程序中可以小窗使用其他程序

    (3) Notifycations Dots 应用程序图标上出现通知小点提示,长按可查看

    (4)Play Console Dashboard 开发人员工具(还没用过,准备看看)

    (5)自定义字体终于支持了

    (6)....

    5、Android 9.0

    (1)室内wifi定位

    (2)刘海平的支持(好吧,我一直觉得很丑)

    (3)Notifycation (每个版本你都改)

    (4)通道设置,广播以及免打扰

    (5)多相机支持

    (6)新的图片解码,动画优化

    (7)....

    Android版本基本上是一年一个,哎,感觉做一个Android程序猿好累啊,每天都要学习新东西,不然很容易就被谷歌抛弃了,5.0之前的技术我就不建议大家去看了,感觉5.0以上机型基本都是最低国人配置了。好吧东西很多,写到这里发现自己要学习的东西还很多,接下来再介绍一下Android的系统架构...

    二、Android系统架构

    Android系统分为四层架构

    1、Linux内核层

        Android系统是基于Linux内核的,Android系统提供硬件的驱动,音频驱动,视频驱动,蓝牙,wifi驱动等等吧。(一般作为android应用开发,没必要学习这些东西)

    2、系统运行库层

    C/C++ 为Android提供解决一些Java代码干不好的事,比如OpenGL/ES 3D绘图,WebKit提供了浏览器内核的支持。(这个作为android开发的我们来说还是很值得学习)

    3、应用框架层

    提供Android构建程序所需要的API,我感觉就是SDK

    4、应用层

    安装在你手机上的应用程序就是组成这一层的东西了

    今天就写这么多了,我呢是被我的学长带入的Android之路(坑),当时他就和我说,Android学起来不是很难,就是学习面比较杂,要学的东西很多,现在想起来,真的是。。。放屁,要学的东西那叫超级多好么,而且我怎么没感觉到简单呢。。。

    展开全文
  • 总是听到有人说AndroidX,到底什么是AndroidX?

    万次阅读 多人点赞 2019-08-26 08:06:59
    Android技术迭代更新很快,各种新出的技术和名词也是层出不穷。不知从什么时候开始,总是会时不时听到AndroidX这个名词,这难道又是什么新出技术吗?相信有很多朋友也会存在这样的疑惑,那么今天我就来写一篇科普...

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。

    Android技术迭代更新很快,各种新出的技术和名词也是层出不穷。不知从什么时候开始,总是会时不时听到AndroidX这个名词,这难道又是什么新出技术吗?相信有很多朋友也会存在这样的疑惑,那么今天我就来写一篇科普文章,向大家介绍AndroidX的前世今生。

    Android系统在刚刚面世的时候,可能连它的设计者也没有想到它会如此成功,因此也不可能在一开始的时候就将它的API考虑的非常周全。随着Android系统版本不断地迭代更新,每个版本中都会加入很多新的API进去,但是新增的API在老版系统中并不存在,因此这就出现了一个向下兼容的问题。

    举个例子,当Android系统发布到3.0版本的时候,突然意识到了平板电脑的重要性,因此为了让Android可以更好地兼容平板,Android团队在3.0系统(API 11)中加入了Fragment功能。但是Fragment的作用并不只局限于平板,以前的老系统中也想使用这个功能该怎么办?于是Android团队推出了一个鼎鼎大名的Android Support Library,用于提供向下兼容的功能。比如我们每个人都熟知的support-v4库,appcompat-v7库都是属于Android Support Library的,这两个库相信任何做过Android开发的人都使用过。

    但是可能很多人并没有考虑过support-v4库的名字到底是什么意思,这里跟大家解释一下。4在这里指的是Android API版本号,对应的系统版本是1.6。那么support-v4的意思就是这个库中提供的API会向下兼容到Android 1.6系统。它对应的包名如下:

    类似地,appcompat-v7指的是将库中提供的API向下兼容至API 7,也就是Android 2.1系统。它对应的包名如下:

    可以发现,Android Support Library中提供的库,它们的包名都是以android.support.*开头的。

    但是慢慢随着时间的推移,什么1.6、2.1系统早就已经被淘汰了,现在Android官方支持的最低系统版本已经是4.0.1,对应的API版本号是15。support-v4、appcompat-v7库也不再支持那么久远的系统了,但是它们的名字却一直保留了下来,虽然它们现在的实际作用已经对不上当初命名的原因了。

    那么很明显,Android团队也意识到这种命名已经非常不合适了,于是对这些API的架构进行了一次重新的划分,推出了AndroidX。因此,AndroidX本质上其实就是对Android Support Library进行的一次升级,升级内容主要在于以下两个方面。

    第一,包名。之前Android Support Library中的API,它们的包名都是在android.support.*下面的,而AndroidX库中所有API的包名都变成了在androidx.*下面。这是一个很大的变化,意味着以后凡是android.*包下面的API都是随着Android操作系统发布的,而androidx.*包下面的API都是随着扩展库发布的,这些API基本不会依赖于操作系统的具体版本。

    第二,命名规则。吸取了之前命名规则的弊端,AndroidX所有库的命名规则里都不会再包含具体操作系统API的版本号了。比如,像appcompat-v7库,在AndroidX中就变成了appcompat库。

    一个AndroidX完整的依赖库格式如下所示:

    implementation 'androidx.appcompat:appcompat:1.0.2'
    

    了解了AndroidX是什么之后,现在你应该放轻松了吧?它其实并不是什么全新的东西,而是对Android Support Library的一次升级。因此,AndroidX上手起来也没有任何困难的地方,比如之前你经常使用的RecyclerView、ViewPager等等库,在AndroidX中都会有一个对应的版本,只要改一下包名就可以完全无缝使用,用法方面基本上都没有任何的变化。

    但是有一点需要注意,AndroidX和Android Support Library中的库是非常不建议混合在一起使用的,因为它们可能会产生很多不兼容的问题。最好的做法是,要么全部使用AndroidX中的库,要么全部使用Android Support Library中的库。

    而现在Android团队官方的态度也很明确,未来都会为AndroidX为主,Android Support Library已经不再建议使用,并会慢慢停止维护。另外,从Android Studio 3.4.2开始,我发现新建的项目已经强制勾选使用AndroidX架构了。

    那么对于老项目的迁移应该怎么办呢?由于涉及到了包名的改动,如果从Android Support Library升级到AndroidX需要手动去改每一个文件的包名,那可真得要改死了。为此,Android Studio提供了一个一键迁移的功能,只需要对着你的项目名右击 → Refactor → Migrate to AndroidX,就会弹出如下图所示的窗口。

    这里点击Migrate,Android Studio就会自动检查你项目中所有使用Android Support Library的地方,并将它们全部改成AndroidX中对应的库。另外Android Studio还会将你原来的项目备份成一个zip文件,这样即使迁移之后的代码出现了问题你还可以随时还原回之前的代码。

    好了,关于AndroidX的内容就讲到这里,相信也是解决了不少朋友心中的疑惑。由于这段时间以来一直在努力赶《第一行代码 第3版》的进度,所以原创文章的数量偏少了一些,也请大家见谅。


    关注我的技术公众号,每个工作日都有优质技术文章推送。

    微信扫一扫下方二维码即可关注:

    展开全文
  • 英文原文:http://developer.android.com/guide/components/intents-common.html 采集(更新)日期:2014-7-16 在本文中 闹钟 创建闹钟创建计时器显示所有闹钟 日历 添加日历事件 摄像头 拍照...

    Common Intents


    英文原文:http://developer.android.com/guide/components/intents-common.html
    采集(更新)日期:2014-7-16

    通过 Intent 可以启动其他应用程序中的 Activity ,只要在此 Intent 对象中给出需要执行的操作即可(比如“查看地图”或“拍照”)。由于这里未指定需要启动的组件,而只是给出了 Action 和执行 Action 所用到的 数据,这种 Intent 就被称为隐式 Intent。

    在把隐式 Intent 作为参数调用 startActivity()startActivityForResult() 时,系统会 解析该Intent 并发送给能够处理该 Intent 的应用程序,并启动相应的 Activity。如果能够处理该 Intent 的应用程序超过一个,系统会给出对话框供用户选择。

    本文介绍了多个用于执行常见 Action 的隐式 Intent,并按照处理这些 Intent 的应用程序进行了归类。每个章节还介绍了如何通过创建 Intent过滤器 来对应用程序的 Action 处理能力进行公布。

    提醒: 如果当前设备上不存在可接收某种隐式 Intent 的应用程序,则调用startActivity() 的应用程序将会崩溃。 为了预先判断一下是否存在可接收 Intent的应用程序,请调用 Intent 对象的 resolveActivity()。 如果结果非空,则表示至少存在一个可处理该 Intent的应用程序,并且可安全调用 startActivity()。 如果结果为 null ,请勿再使用该 Intent,并尽可能关闭那些会发起该Intent 的功能。

    如果还不清楚 Intent 和 Intent 过滤器的创建过程,请先去阅读 Intent 和Intent 过滤器

    闹钟


    创建闹钟

    要新建一个闹钟,请使用ACTION_SET_ALARM并设置闹钟的详细参数,包括在 Intent 的附件(extra)中给出时间和文字信息,如下所示。

    注意: 在 Android 2.3 (API 级别 9)版本中,附件里只能包含小时、分钟和文字信息。其他类型的附件是在后续版本的系统中加入的。

    Action
    ACTION_SET_ALARM
    数据 URI
    MIME 类型
    附件
    EXTRA_HOUR
    闹钟的小时数。
    EXTRA_MINUTES
    闹钟的分钟数
    EXTRA_MESSAGE
    用于标识闹钟的文字信息。
    EXTRA_DAYS
    一个 ArrayList对象, 存放了本闹钟需要在每周的星期几重复触发。 每一天用 Calendar类中定义的整数值来表示,比如 MONDAY

    如果是一次性的闹钟,请勿给出该附件。

    EXTRA_RINGTONE
    一个 content: URI ,用于指定闹钟所用的铃声。 如果不需要铃声则为VALUE_RINGTONE_SILENT

    如果要使用默认的铃声,就不需要指定本附件。

    EXTRA_VIBRATE
    布尔值,指明闹钟是否需要振动。
    EXTRA_SKIP_UI
    布尔值,指明应用程序在设定闹钟时是否要跳过用户交互过程。 如果设为 True,则应用程序将会跳过所有的确认界面,直接设定所需的闹钟。

    Intent 示例:

    public void createAlarm(String message, int hour, int minutes) { 
    
        Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) 
    
                .putExtra(AlarmClock.EXTRA_MESSAGE, message) 
    
                .putExtra(AlarmClock.EXTRA_HOUR, hour) 
    
                .putExtra(AlarmClock.EXTRA_MINUTES, minutes); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    注意:

    为了调用 ACTION_SET_ALARM Intent,应用程序必须拥有 SET_ALARM 权限:

    < uses-permission android:name="com.android.alarm.permission.SET_ALARM" / > 
    

    Intent 过滤器示例:

    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.intent.action.SET_ALARM" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
         < /intent-filter >  
    
    < /activity > 
    

    创建计时器

    要创建一个倒计时的计时器,请使用 ACTION_SET_TIMER 并在附件中设定计时器的详细参数,比如时长,如下所示。

    注意:本 Intent 自 Android 4.4 (API 级别 19)开始引入。

    Action
    ACTION_SET_TIMER
    数据 URI
    MIME 类型
    附件
    EXTRA_LENGTH
    计时器的时长,单位为秒。
    EXTRA_MESSAGE
    用于标识该计时器的自定义文字信息。
    EXTRA_SKIP_UI
    布尔值,指明应用程序在设定计时器时是否要跳过用户交互过程。 如果设为 True,则应用程序将会跳过所有的确认界面,直接设定所需的计时器。

    Intent 示例:

    public void startTimer(String message, int seconds) { 
    
        Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) 
    
                .putExtra(AlarmClock.EXTRA_MESSAGE, message) 
    
                .putExtra(AlarmClock.EXTRA_LENGTH, seconds) 
    
                .putExtra(AlarmClock.EXTRA_SKIP_UI, true); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    注意:

    为了调用 ACTION_SET_TIMER Intent ,应用程序必须拥有 SET_ALARM 权限:

    < uses-permission android:name="com.android.alarm.permission.SET_ALARM" / > 
    

    Intent 过滤器示例:

    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.intent.action.SET_TIMER" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
         < /intent-filter >  
    
    < /activity > 
    

    列出所有闹钟

    要显示所有闹钟的列表,请使用 ACTION_SHOW_ALARMS

    虽然用到本 Intent 的应用程序应该不会很多(主要用于系统应用), 所有当作闹钟使用的应用程序都必须实现本 Intent过滤器,以便能列出当前所有的闹钟。

    注意: 本 Intent 自 Android 4.4 (API 级别 19)开始引入。

    Action
    ACTION_SHOW_ALARMS
    数据 URI
    MIME 类型

    Intent 过滤器示例:

    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.intent.action.SHOW_ALARMS" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
         < /intent-filter >  
    
    < /activity > 
    

    Calendar


    添加日历事件

    为了在用户的日历中加入一个新事件,请使用 ACTION_INSERT 并用 Events.CONTENT_URI 指定数据 URI 。还可以在附件中设定事件的各种细节参数,如下所示。

    Action
    ACTION_INSERT
    数据 URI
    Events.CONTENT_URI
    MIME 类型
    "vnd.android.cursor.dir/event"
    附件
    EXTRA_EVENT_ALL_DAY
    布尔值,指明是否为全天性事件。
    EXTRA_EVENT_BEGIN_TIME
    事件的起始时间(自公元纪年开始的毫秒数)。
    EXTRA_EVENT_END_TIME
    事件的终止时间(自公元纪年开始的毫秒数)。
    TITLE
    事件的标题。
    DESCRIPTION
    事件的说明。
    EVENT_LOCATION
    事件的地点。
    EXTRA_EMAIL
    受邀者的 Email 地址列表,中间用逗号分隔。

    可用的事件参数还有很多,都在 CalendarContract.EventsColumns 类中给出了常量定义。

    Intent 示例:

    public void addEvent(String title, String location, Calendar begin, Calendar end) { 
    
        Intent intent = new Intent(Intent.ACTION_INSERT) 
    
                .setData(Events.CONTENT_URI) 
    
                .putExtra(Events.TITLE, title) 
    
                .putExtra(Events.EVENT_LOCATION, location) 
    
                .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) 
    
                .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    

    Intent 过滤器示例:

    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.intent.action.INSERT" / >  
    
             < data android:mimeType="vnd.android.cursor.dir/event" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
         < /intent-filter >  
    
    < /activity > 
    

    摄像头


    拍照或摄像并返回结果

    为了启动摄像头应用并接收返回的照片或视频,请使用 ACTION_IMAGE_CAPTUREACTION_VIDEO_CAPTURE 。 并且在附件 EXTRA_OUTPUT 中,还需要指定照片或视频的保存位置 URI 。

    Action
    ACTION_IMAGE_CAPTURE
    ACTION_VIDEO_CAPTURE
    数据 URI Scheme
    MIME 类型
    附件
    EXTRA_OUTPUT
    摄像头应用将把照片或视频文件保存到 URI 指定的位置 (以 Uri对象的方式给出)。

    一旦摄像头应用成功返回到调用 Activity (应用程序收到 onActivityResult() 回调方法),就可以在由 EXTRA_OUTPUT 值指定的 URI 位置访问到照片或视频文件。

    注意: 当使用 ACTION_IMAGE_CAPTURE 拍照时,摄像头可以在结果 Intent 中同时返回一张小尺寸的缩略图,位于附件中的“data”字段中,格式为Bitmap

    Intent 示例:

    static final int REQUEST_IMAGE_CAPTURE = 1; 
    
    static final Uri mLocationForPhotos; 
    
    
    
    public void capturePhoto(String targetFilename) { 
    
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    
        intent.putExtra(MediaStore.EXTRA_OUTPUT, 
    
                Uri.withAppendedPath(mLocationForPhotos, targetFilename); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); 
    
        } 
    
    } 
    
    
    
    @Override 
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
    
            Bitmap thumbnail = data.getParcelable("data"); 
    
            // 用 mLocationForPhotos 中的全尺寸图片文件进行其他操作 
    
            ... 
    
        } 
    
    }
    
    

    关于如何通过 Intent 拍照的更多信息,包括如何为保存文件创建合适的 Uri,请参阅 拍照初步 摄像初步

    Intent 过滤器:

    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.media.action.IMAGE_CAPTURE" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
         < /intent-filter >  
    
     < /activity > 
     
    

    在处理该 Intent 时, Activity 应该检查传入 Intent 的附件数据 EXTRA_OUTPUT ,然后把捕获到的图像或视频保存到该其指定的位置,并用包含了缩略图的Intent 调用 setResult() ,缩略图数据应存放在 Intent 附件的“data”部分。

    通讯录/联系人应用


    选择联系人

    要让用户选择联系人并访问其所有数据,请使用 ACTION_PICK ,并把 MIME 类型设定为 Contacts.CONTENT_TYPE

    在传给回调方法 onActivityResult() 的结果 Intent 中,包含了指向所选的联系人数据的 content: URI 。这时还向调用方应用临时授予读取通讯录的权限,这是通过 Contacts Provider API 来完成的,即使该应用没有包含 READ_CONTACTS 权限也没有关系。

    提示: 如果只需要访问联系人的部分信息,比如电话号码或 Email 地址,请参阅下一章节选择联系人的指定信息

    Action
    ACTION_PICK
    数据 URI Scheme
    MIME 类型
    Contacts.CONTENT_TYPE

    Intent 示例:

    static final int REQUEST_SELECT_CONTACT = 1; 
    
    
    
    public void selectContact() { 
    
        Intent intent = new Intent(Intent.ACTION_PICK); 
    
        intent.setType(ContactsContract.Contacts.CONTENT_TYPE); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivityForResult(intent, REQUEST_SELECT_CONTACT); 
    
        } 
    
    } 
    
    
    
    @Override 
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    
        if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { 
    
            Uri contactUri = data.getData(); 
    
            // 利用 contactUri 执行某些操作
    
            ... 
    
        } 
    
    }
    

    有了联系人的 URI 之后,如何读取联系人详细数据的详细内容,请参阅 读取联系人详细数据。 请记住,用上述 Intent 访问联系人 URI时,读取详细信息是不需要 READ_CONTACTS 权限的。

    选择联系人的指定信息

    为了能让用户选择联系人的部分信息,比如电话、Email 地址或其他数据,请使用 ACTION_PICK ,并指定下述的数据 MIME 类型,比如 CommonDataKinds.Phone.CONTENT_TYPE 就是用于获取联系人电话号码的。

    如果只需要从通讯录中读取某一类数据,则用 ContactsContract.CommonDataKinds 类中定义的CONTENT_TYPE 会比上一节提到的 Contacts.CONTENT_TYPE 效率更高,因为返回的结果直接就是目标数据,不需要再在Contacts Provider 上执行更复杂的查询。

    在传给回调方法 onActivityResult() 的结果 Intent 中,包含了指向所选的联系人数据的 content: URI 。这时还向调用方应用临时授予读取通讯录的权限,即使该应用没有包含 READ_CONTACTS 权限也没有关系。

    Action
    ACTION_PICK
    数据 URI Scheme
    MIME 类型
    CommonDataKinds.Phone.CONTENT_TYPE
    读取联系人电话号码。
    CommonDataKinds.Email.CONTENT_TYPE
    读取联系人 email 地址。
    CommonDataKinds.StructuredPostal.CONTENT_TYPE
    读取联系人邮寄地址。

    或者是 ContactsContract 中定义的其他 CONTENT_TYPE 值。

    Intent 示例:

    static final int REQUEST_SELECT_PHONE_NUMBER = 1; 
    
    
    
    public void selectContact() { 
    
        // 打开 Activity 让用户从通讯录中选取一个电话号码 
    
        Intent intent = new Intent(Intent.ACTION_PICK); 
    
        intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); 
    
        } 
    
    } 
    
    
    
    @Override 
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    
        if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { 
    
            // 获取 URI 并在 Content Provider 中查询电话号码 
    
            Uri contactUri = data.getData(); 
    
            String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; 
    
            Cursor cursor = getContentResolver().query(contactUri, projection, 
    
                    null, null, null); 
    
            // 如果返回的游标有效,则读取电话号码 
    
            if (cursor != null && cursor.moveToFirst()) { 
    
                int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); 
    
                String number = cursor.getString(numberIndex); 
    
                // 利用电话号码执行某些操作 
    
                ... 
    
            } 
    
        } 
    
    }
    

    查看联系人

    要显示一个已有联系人的详细信息,请使用 ACTION_VIEW ,同时在 Intent 的数据部分中用 content:指定联系人。

    获得联系人 URI 的方法主要有两种:

    Action
    ACTION_VIEW
    数据 URI Scheme
    content: < URI >
    MIME 类型
    无。类型可由联系人的 URI 得出。

    Intent 示例:

    public void viewContact(Uri contactUri) { 
    
        Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    

    编辑已有联系人

    要编辑已有联系人,请使用 ACTION_EDIT ,在 Intent 的数据部分用 content: 指定content: URI , 在 Intent 的附件部分用 ContactsContract.Intents.Insert 定义的常量给出已知联系人的信息。

    获得联系人 URI 的方式主要有两种:

    Action
    ACTION_EDIT
    数据 URI Scheme
    content: < URI >
    MIME 类型
    从联系人 URI 中得出。
    附件
    ContactsContract.Intents.Insert中给出了很多附件常量的定义,可用来声明联系人信息的各个字段。

    Intent 示例:

    public void editContact(Uri contactUri, String email) { 
    
        Intent intent = new Intent(Intent.ACTION_EDIT); 
    
        intent.setData(contactUri); 
    
        intent.putExtra(Intents.Insert.EMAIL, email); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    

    关于编辑联系人的更多信息,请参阅 利用 Intent 修改通讯录

    添加联系人

    要添加一个新的联系人,请使用 ACTION_INSERT ,用 Contacts.CONTENT_TYPE 指定 MIME 类型,在附件部分用 ContactsContract.Intents.Insert 中定义的常量指定已知的联系人信息。

    Action
    ACTION_INSERT
    数据 URI Scheme
    MIME 类型
    Contacts.CONTENT_TYPE
    附件
    一个或多个由 ContactsContract.Intents.Insert 定义的附件数据。

    Intent 示例:

    public void insertContact(String name, String email) { 
    
        Intent intent = new Intent(Intent.ACTION_INSERT); 
    
        intent.setType(Contacts.CONTENT_TYPE); 
    
        intent.putExtra(Intents.Insert.NAME, name); 
    
        intent.putExtra(Intents.Insert.EMAIL, email); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    

    关于添加联系人的更多信息,请参阅 利用 Intent 修改通讯录

    Email


    撰写可带附件的 Email

    要撰写一封 Email,请根据是否包含邮件附件来选用一种下述的 Action , 并且在 Intent 附件中用下述键值给出Email 的详细信息,比如收件人和主题等。

    Action
    ACTION_SENDTO (不带邮件附件时)或
    ACTION_SEND (带有一个邮件附件时)或
    ACTION_SEND_MULTIPLE (带有多个邮件附件时)
    数据 URI Scheme
    MIME 类型
    PLAIN_TEXT_TYPE ("text/plain")
    "**");
       intent.putExtra(Intent.EXTRA_EMAIL, addresses);
       intent.putExtra(Intent.EXTRA_SUBJECT, subject);
       intent.putExtra(Intent.EXTRA_STREAM, attachment);
        if(intent.resolveActivity(getPackageManager()) != null) {
           startActivity(intent);
        }
    }
    如果要确保仅能由 Email 应用来处理 Intent (不允许其他文字信息或社交类应用进行处理), 请使用
    ACTION_SENDTO ,并将数据 URI Scheme 给定为"mailto:"。例如:

    public void composeEmail(String[] addresses, String subject) { 
    
        Intent intent = new Intent(Intent.ACTION_SENDTO); 
    
        intent.setData(Uri.parse("mailto:")); // 只允许 Email 应用来处理 
    
        intent.putExtra(Intent.EXTRA_EMAIL, addresses); 
    
        intent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    

    Intent 过滤器示例:

    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.intent.action.SEND" / >  
    
             < data android:type="**”。
    
    
    
    Action
    ACTION_OPEN_DOCUMENT
    ACTION_CREATE_DOCUMENT
    数据 URI Scheme
    MIME 类型
    MIME 类型与用户选择的文件类型相对应。
    附件
    EXTRA_MIME_TYPES
    MIME 类型的数组,对应于应用程序需要的文件类型。 如果使用了该附件数据,就必须把主 MIME 类型用setType() 设为 “*/*”。
    EXTRA_ALLOW_MULTIPLE
    布尔值,标明用户是否可以一次选取多个文件。
    EXTRA_TITLE
    使用 ACTION_CREATE_DOCUMENT 时用来指定初始文件名称。
    EXTRA_LOCAL_ONLY
    布尔值,标明返回的文件是否可从设备直接访问,而不需要从远程服务中下载。
    类型
    CATEGORY_OPENABLE
    表示仅返回“可打开”的文件,也就是可用 openFileDescriptor() 来表示的文件流。
    
    读取图片文件的 Intent 示例:
    
    static final int REQUEST_IMAGE_OPEN = 1; 
    
    
    
    public void selectImage() { 
    
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    
        intent.setType("image/*"); 
    
        intent.addCategory(Intent.CATEGORY_OPENABLE); 
    
        // 只有系统能收到 ACTION_OPEN_DOCUMENT,因此不必检测。 
    
        startActivityForResult(intent, REQUEST_IMAGE_OPEN); 
    
    } 
    
     
    
    @Override 
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    
        if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { 
    
            Uri fullPhotoUri = data.getData(); 
    
            // 用 fullPhotoUri 中的全尺寸图片文件执行某些操作 
    
            ... 
    
        } 
    
    }
    
    
    
    其实,第三方应用无法真正响应 Action 为
    ACTION_OPEN_DOCUMENT
    的 Intent 。
    而是由系统接收此类 Intent ,并在统一的用户界面中显示来自各个应用的所有可用文件。
    
    
    
    
    
    为了能在这个系统界面中显示出文件,并允许其他应用程序打开这些文件,应用程序必须实现一个
    DocumentsProvider
    对象,其中包含了
    PROVIDER_INTERFACE
    Intent 过滤器("android.content.action.DOCUMENTS_PROVIDER")。
    例如:
    
    
    < provider ... 
    
        android:grantUriPermissions="true" 
    
        android:exported="true" 
    
        android:permission="android.permission.MANAGE_DOCUMENTS" >  
    
         < intent-filter >  
    
             < action android:name="android.content.action.DOCUMENTS_PROVIDER" / >  
    
         < /intent-filter >  
    
    < /provider > 
    
    
    
    关于如何让自己的文件可以被其他应用程序打开的更多信息,请参阅
    存储访问架构指南。
    
    
    
    

    地图


    
    

    在地图上显示地理位置

    
    
    要打开地图,请使用
    ACTION_VIEW
    并在 Intent 数据部分给出位置信息,数据的 Scheme 在下述内容中选取一个。
    
    
    
    Action
    ACTION_VIEW
    数据 URI Scheme
    geo:latitude,longitude
    显示指定经纬度位置的地图。

    例如"geo:47.6,-122.3"

    geo:latitude,longitude?z=zoom
    以某个缩放级别显示给定经纬度位置的地图。 放大级别为 1 表示整个地球,以给定的latlng 为中心。 最高(最大)的放大级别为 23 。

    例如:“geo:47.6,-122.3?z=11

    geo:0,0?q=lat,lng(label)
    显示指定经纬度位置的地图,并带有一个字符串标签。

    例如:"geo:0,0?q=34.99,-106.61(Treasure)"

    geo:0,0?q=my+street+address
    显示由“my street address”查询出来的位置(地址或位置查询)。

    例如:"geo:0,0?q=1600+Amphitheatre+Parkway,+CA"

    注意: geo URI 中的所有字符串必须经过转码。 例如,字符串1st & Pike, Seattle 应该写为 1st & Pike,Seattle。 字符串中的空格可以用 转码,也可以用加号代替(+)。

    MIME 类型
    
    Intent 示例:
    
    public void showMap(Uri geoLocation) { 
    
        Intent intent = new Intent(Intent.ACTION_VIEW); 
    
        intent.setData(geoLocation); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    
    Intent 过滤器示例:
    
    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.intent.action.VIEW" / >  
    
             < data android:scheme="geo" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
         < /intent-filter >  
    
    < /activity > 
    
    
    

    音乐和视频


    
    

    播放媒体文件

    
    
    要播放音频文件,请使用
    ACTION_VIEW
    并在 Intent 数据部分指定文件的 URI 位置。
    
    
    
    Action
    ACTION_VIEW
    数据 URI Scheme
    file: < URI >
    content: < URI >
    http: < URL >
    MIME 类型
    "audio/*"
    "application/ogg"
    "application/x-ogg"
    "application/itunes"
    或其他应用程序需要用到的类型。
    
    Intent 示例:
    
    public void playMedia(Uri file) { 
    
        Intent intent = new Intent(Intent.ACTION_VIEW); 
    
        intent.setData(file); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    
    Intent 过滤器示例:
    
    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.intent.action.VIEW" / >  
    
             < data android:type="audio/*" / >  
    
             < data android:type="application/ogg" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
         < /intent-filter >  
    
    < /activity > 
    
    
    

    根据搜索请求播放音频

    
    
    要根据搜索请求播放音频,请使用
    INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
    Intent。
    在响应用户的语音命令来播放音乐时,应用程序就可以触发该类 Intent。
    接收本 Intent 的应用程序会在其音乐库中进行检索,如果找到匹配的内容就会开始播放。
    
    
    
    
    
    本类 Intent 应该包含字符串型的附件
    EXTRA_MEDIA_FOCUS
    ,用于指定检索模式。
    例如,可以指定检索艺术家名字还是歌名。
    
    
    
    Action
    INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
    数据 URI Scheme
    MIME 类型
    附件
    MediaStore.EXTRA_MEDIA_FOCUS (必填项)

    指明检索模式(用户是否要查找特定的艺术家、专辑、播放列表或广播频道)。 大部分检索模式都需要给出额外的附件数据。例如:如果用户对某首歌感兴趣, Intent 就可能包含三部分额外附件数据:歌名、艺术家和专辑名。 利用 EXTRA_MEDIA_FOCUS 键值,本 Intent 可提供以下检索模式:

    任意"vnd.android.cursor.item/*"

    播放任何音乐。 接收方应用将会智能选择要播放的音乐,比如用户最后一次听过的播放列表。

    额外附件数据:

    • QUERY (必填项)— 空字符串。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。
    非结构化"vnd.android.cursor.item/*"

    根据一个非结构化的检索请求播放特定的歌曲、专辑或某风格的音乐。如果应用程序无法辨识用户需要的音乐类型,那就可以用这种搜索模式创建 Intent 。当然,应用程序还是应该尽可能地使用更为确切的检索模式。

    额外附件数据:

    • QUERY (必填项)— 包含艺术家、专辑、歌曲名称、风格或者这些条件的任意组合的字符串。
    风格 - Audio.Genres.ENTRY_CONTENT_TYPE

    播放指定风格的音乐。

    额外附件数据:

    • "android.intent.extra.genre" (必填项)— 风格。
    • QUERY (必填项)— 风格。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。
    艺术家Audio.Artists.ENTRY_CONTENT_TYPE

    播放指定艺术家的音乐。

    额外附件数据:

    • EXTRA_MEDIA_ARTIST (必填项)— 艺术家。
    • "android.intent.extra.genre" — 艺术家。
    • QUERY (必填项)— 包含艺术家、风格或两者任意组合的字符串。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。
    专辑 - Audio.Albums.ENTRY_CONTENT_TYPE

    播放指定专辑。

    额外附件数据:

    • EXTRA_MEDIA_ALBUM (必填项) — 专辑。
    • EXTRA_MEDIA_ARTIST — 艺术家。
    • "android.intent.extra.genre" — 专辑。
    • QUERY (必填项) — 包含专辑、艺术家或两者任意组合的字符串。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。
    歌曲名称"vnd.android.cursor.item/audio"

    播放指定歌曲。

    额外附件数据:

    • EXTRA_MEDIA_ALBUM — 专辑。
    • EXTRA_MEDIA_ARTIST — 艺术家。
    • "android.intent.extra.genre" — 风格。
    • EXTRA_MEDIA_TITLE (必填项) — 歌曲名称。
    • QUERY (必填项) — 包含专辑、艺术家、风格、歌曲名称或这些条件任意组合的字符串。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。
    广播频道"vnd.android.cursor.item/radio"

    播放指定频道广播或者匹配附件数据给定规则的频道。

    额外附件数据:

    • EXTRA_MEDIA_ALBUM — 专辑。
    • EXTRA_MEDIA_ARTIST — 艺术家。
    • "android.intent.extra.genre" — 风格。
    • "android.intent.extra.radio_channel" — 广播频道。
    • EXTRA_MEDIA_TITLE — 供广播频道参考的歌曲名称。
    • QUERY (必填项) — 包含专辑、艺术家、风格、广播频道、歌曲名称或这些条件任意组合的字符串。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。
    播放列表Audio.Playlists.ENTRY_CONTENT_TYPE

    播放指定列表或匹配附件数据给定规则的列表。

    额外附件数据:

    • EXTRA_MEDIA_ALBUM — 专辑。
    • EXTRA_MEDIA_ARTIST — 艺术家。
    • "android.intent.extra.genre" — 风格。
    • "android.intent.extra.playlist" — 播放列表。
    • EXTRA_MEDIA_TITLE — 供播放列表参考的歌曲名称。
    • QUERY (必填项) — 包含专辑、艺术家、风格、播放列表、歌曲名称或这些条件任意组合的字符串。为了保持向后兼容性,必须给出本附件数据:那些不了解本检索模式的已有应用程序可以将本类 Intent 当作非结构化检索来处理。
    
    Intent 示例:
    
    
    如果用户需要收听正在播放指定艺术家歌曲的广播电台,检索应用程序就可以创建以下 Intent:
    
    public void playSearchRadioByArtist(String artist) { 
    
        Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); 
    
        intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, 
    
                        "vnd.android.cursor.item/radio"); 
    
        intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); 
    
        intent.putExtra(SearchManager.QUERY, artist); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    
    Intent 过滤器示例:
    
    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
         < /intent-filter >  
    
    < /activity > 
    
    
    
    在处理该 Intent 时,为了确定检索模式, Activity 应该检查传入的
    Intent
    的附件值
    EXTRA_MEDIA_FOCUS
    。一旦 Activity 识别出了检索模式,就应该读取该模式下的额外附件数据。
    利用这些信息,应用程序就可以在自己的曲库中查找并播放符合要求的音乐。
    例如:
    
    
    
    protected void onCreate(Bundle savedInstanceState) { 
    
        ... 
    
        Intent intent = this.getIntent(); 
    
        if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { 
    
    
    
            String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); 
    
            String query = intent.getStringExtra(SearchManager.QUERY); 
    
    
    
            // 根据检索模式的不同,有些附件数据可能不可用 
    
            String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); 
    
            String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); 
    
            String genre = intent.getStringExtra("android.intent.extra.genre"); 
    
            String playlist = intent.getStringExtra("android.intent.extra.playlist"); 
    
            String rchannel = intent.getStringExtra("android.intent.extra.radio_channel"); 
    
            String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); 
    
    
    
            // 检测搜索模式并采用相应的附件数据 
    
            if (mediaFocus == null) { 
    
                // “非结构化” 检索模式(向后兼容) 
    
                playUnstructuredSearch(query); 
    
    
    
            } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { 
    
                if (query.isEmpty()) { 
    
                    // “任意”检索模式 
    
                    playResumeLastPlaylist(); 
    
                } else { 
    
                    // “非结构化” 检索模式 
    
                    playUnstructuredSearch(query); 
    
                } 
    
    
    
            } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { 
    
                //“风格” 检索模式 
    
                playGenre(genre); 
    
     
    
            } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { 
    
                // “艺术家” 检索模式 
    
                playArtist(artist, genre); 
    
     
    
            } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { 
    
                // “专辑” 检索模式 
    
                playAlbum(album, artist); 
    
     
    
            } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { 
    
                // “歌曲名称” 检索模式 
    
                playSong(album, artist, genre, title); 
    
     
    
            } else if (mediaFocus.compareTo("vnd.android.cursor.item/radio") == 0) { 
    
                // “广播频道” 检索模式
    
                playRadioChannel(album, artist, genre, rchannel, title); 
    
     
    
            } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { 
    
                // “播放列表” 检索模式 
    
                playPlaylist(album, artist, genre, playlist, title); 
    
            } 
    
        } 
    
    }
    
    
    

    电话


    
    

    拨打电话

    
    
    要打开电话应用并拨打一个电话号码,请使用
    ACTION_DIAL
    并用下述的 URI Scheme 给出电话号码。
    电话应用在打开时会显示这个号码,但用户必须按下Call按钮(译者注:大部分手机的“拨打”键都是个话机图标)才会开始拨打电话。
    
    
    
    Action
    ACTION_DIAL
    数据 URI Scheme
    tel: < phone-number >
    MIME 类型
    
    
    合法的电话号码由
    the IETF RFC 3966
    标准定义。
    示例如下:
    
    
    • tel:2125551212
    • tel:(212) 555 1212
    
    
    拨号应用对于电话号码的格式识别已经很完美了。
    因此在
    Uri.parse()
    方法中并未用到很严格的 Scheme 定义。
    不过,如果某个 Scheme 没有用过或者不确定是否能被处理,则可以换用
    Uri.fromParts()Intent 示例:
    
    public void dialPhoneNumber(String phoneNumber) { 
    
        Intent intent = new Intent(Intent.ACTION_DIAL); 
    
        intent.setData(Uri.parse("tel:" + phoneNumber)); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    
    

    设置


    
    

    打开系统设置中的某个项目

    
    
    如果要让用户修改某些设置,就要打开系统设置中的对应窗口,
    请使用以下 Action 的 Intent 来完成, Action 的名称与各项设置的窗口相对应。
    
    
    
    Action
    ACTION_SETTINGS
    ACTION_WIRELESS_SETTINGS
    ACTION_AIRPLANE_MODE_SETTINGS
    ACTION_WIFI_SETTINGS
    ACTION_APN_SETTINGS
    ACTION_BLUETOOTH_SETTINGS
    ACTION_DATE_SETTINGS
    ACTION_LOCALE_SETTINGS
    ACTION_INPUT_METHOD_SETTINGS
    ACTION_DISPLAY_SETTINGS
    ACTION_SECURITY_SETTINGS
    ACTION_LOCATION_SOURCE_SETTINGS
    ACTION_INTERNAL_STORAGE_SETTINGS
    ACTION_MEMORY_CARD_SETTINGS

    关于其他设置窗口对应的 Action,请参阅 设置 文档。

    数据 URI Scheme
    MIME 类型
    
    Intent 示例:
    
    public void openWifiSettings() { 
    
        Intent intent = new Intent(Intent.ACTION_WIFI_SETTINGS); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    
    

    文字短消息


    
    

    撰写带有附件的 SMS/MMS 消息

    
    
    要新建一条 SMS 或 MMS 消息,请使用以下 Action 的 Intent ,
    并利用下述的附件键值给出短消息的细节,比如电话号码、主题、消息内容等。
    
    
    
    Action
    ACTION_SENDTO
    ACTION_SEND
    ACTION_SEND_MULTIPLE
    数据 URI Scheme
    sms: < phone_number >
    smsto: < phone_number >
    mms: < phone_number >
    mmsto: < phone_number >

    这些 Scheme 是同时处理的。

    MIME 类型
    PLAIN_TEXT_TYPE"text/plain"
    "image/*"
    "video/*"
    附件
    "subject"
    用作短信主题的字符串(通常仅用于 MMS)。
    "sms_body"
    用作短信内容的字符串。
    EXTRA_STREAM
    指向图片或视频附件的 Uri。如果使用 ACTION_SEND_MULTIPLE ,则本 Intent 附件应该是一个由指向图片、视频的Uri组成的 ArrayList
    
    Intent 示例:
    
    public void composeMmsMessage(String message, Uri attachment) { 
    
        Intent intent = new Intent(Intent.ACTION_SEND); 
    
        intent.setType(HTTP.PLAIN_TEXT_TYPE); 
    
        intent.putExtra("sms_body", message); 
    
        intent.putExtra(Intent.EXTRA_STREAM, attachment); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    
    
    如果要确保 Intent 只允许由短信应用(而不是其他 Email 或社交类应用)进行处理,请使用
    ACTION_SENDTO
    并将数据 Scheme 给定为 “smsto:” 。例如:
    
    
    
    public void composeMmsMessage(String message, Uri attachment) { 
    
        Intent intent = new Intent(Intent.ACTION_SEND); 
    
        intent.setData(Uri.parse("smsto:"));         // 这就确保只有 SMS 应用才能响应 
    
        intent.putExtra("sms_body", message); 
    
        intent.putExtra(Intent.EXTRA_STREAM, attachment); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    
    Intent 过滤器示例:
    
    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.intent.action.SEND" / >  
    
             < data android:type="text/plain" / >  
    
             < data android:type="image/*" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
         < /intent-filter >  
    
    < /activity > 
    
    
    
    注意:
    如果要开发一款 SMS/MMS 消息应用程序,为了在 Android 4.4 以上版本中能够被用作默认 SMS 应用,
    必须为很多额外的 Action 实现 Intent 过滤器。
    详情请参阅文档
    Telephony
    

    Web 浏览器


    
    

    载入 Web URL

    
    
    要打开一个网页,请使用
    ACTION_VIEW
    并在 Intent 数据部分指定 Web URL。
    
    
    
    Action
    ACTION_VIEW
    数据 URI Scheme
    http: < URL >
    https: < URL >
    MIME 类型
    PLAIN_TEXT_TYPE (“text/plain”)
    "text/html"
    "application/xhtml+xml"
    "application/vnd.wap.xhtml+xml"
    
    Intent 示例:
    
    public void openWebPage(String url) { 
    
        Uri webpage = Uri.parse(url); 
    
        Intent intent = new Intent(Intent.ACTION_VIEW, webpage); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    
    
    Intent 过滤器示例:
    
    < activity ... >  
    
         < intent-filter >  
    
             < action android:name="android.intent.action.VIEW" / >  
    
             < !-- Include the host attribute if you want your app to respond 
    
                 only to URLs with your app's domain. -- >  
    
             < data android:scheme="http" android:host="www.example.com" / >  
    
             < category android:name="android.intent.category.DEFAULT" / >  
    
             < !-- The BROWSABLE category is required to get links from web pages. -- >  
    
             < category android:name="android.intent.category.BROWSABLE" / >  
    
         < /intent-filter >  
    
    < /activity > 
    
    
    
    提示:
    如果你的 Android 应用的功能与你的 Web 网站类似,请为指向你的网站的 URL 声明一条 Intent 过滤器。
    这样,如果用户已经安装了你的应用,则在邮件或其他网页中点击你的网站链接,就会直接打开你的 Android 应用,而不是你的网站。
    
    
    
    

    执行 Web 搜索

    
    
    要启动一次 Web 搜索,请使用
    ACTION_WEB_SEARCH
    并在附件
    SearchManager.QUERY
    中指定搜索字符串。
    
    
    
    Action
    ACTION_WEB_SEARCH
    数据 URI Scheme
    MIME 类型
    附件
    SearchManager.QUERY
    搜索字符串
    
    Intent 示例:
    
    public void searchWeb(String query) { 
    
        Intent intent = new Intent(Intent.ACTION_SEARCH); 
    
        intent.putExtra(SearchManager.QUERY, query); 
    
        if (intent.resolveActivity(getPackageManager()) != null) { 
    
            startActivity(intent); 
    
        } 
    
    }
    
    展开全文
  • Android串口通信例子

    热门讨论 2020-07-30 21:25:05
    这是一个大家都可以用的232串口通信例子,当你运行直接崩溃的时候就要修改串口路径
  • 安卓逆向开发的python小程序,可以实现自动化提取,但是目前只能实现单个提取,需要优化,并且需要加入数据库
  • AndroidX了解一下

    万次阅读 多人点赞 2019-10-14 17:16:46
    1.前言 我选取了几个常用依赖库,我们可以看看变化: ... AndroidX build artifact ... com.android.support:support-compat ... androidx.core:core:1.0.0+ ... com.android.support:appcompat-v7 ... androidx.appco...

    推荐阅读:Android 开发高手课 温故知新篇

    1.说明

    官方原文如下

    We hope the division between android.* and androidx.* makes it more obvious which APIs are bundled with the platform, and which are static libraries for app developers that work across different versions of Android.

    简单地说就是新的库可以在不同的Android版本上使用。比如之前我们如果使用support为27.1.1的相关依赖库时。可能需要所有相关的support 库都为27.1.1。如果其中有bug的话,可能需要所有的都去升级,存在一个绑定关系,而且正式版的发布周期也很长。

    通过AndroidX,我们可以看到实时实现的特性和bug修复。升级个别依赖,不需要对使用的所有其他库进行更新。这就和我们使用Github上的开源库一样的,出了问题,我们可以提出bug和意见。作者修复后,发布新版本,我们就可以直接替换使用了。更加的透明便捷。

    2.变化

    我选取了几个常用依赖库,我们可以看看变化:

    Old build artifact AndroidX build artifact
    com.android.support:support-compat androidx.core:core:1.0.0+
    com.android.support:appcompat-v7 androidx.appcompat:appcompat:1.0.0+
    com.android.support:design com.google.android.material:material:1.0.0+
    com.android.support:multidex androidx.multidex:multidex:2.0.0+
    com.android.support:recyclerview-v7 androidx.legacy:legacy-support-v4:1.0.0+
    com.android.support:viewpager androidx.viewpager:viewpager:1.0.0+
    com.android.support:support-fragment androidx.fragment:fragment:1.0.0+

    当然涉及的不止这些库,更详细的变化内容可以查看官方文档

    我们可以添加appcompat依赖对比一下:

    implementation 'com.android.support:appcompat-v7:28.0.0-beta1'
    或
    implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
    

    可以看到详细变化

      

    同时我们看到viewpagerswiperefreshlayoutcoordinatorlayout 等一些UI组件被分离了出来,这样也是便于更好的使用,职责分明,以减轻不使用ProGuardMultidex的应用程序和测试的压力。

    3.影响

    官方博客中有说道,为了给开发者一定迁移的时间,所以28.0.0的稳定版本还是采用android.support。但是所有后续的功能版本都将采用androidx

    其实对于我们影响也不是很大,我们可以选择不使用,毕竟不是强制的。但长远看来还是有好处的。接受变化,拥抱变化也是我们程序猿需要有的精神,欢迎尝试。

    对于有写一些开源项目的人,可能会有一些影响。比如你有一个关于RecyclerView的拓展库,那么你就需要去让他支持AndroidX,否则你懂的。

    我有去看了一下我们常用的butterknifeglide 等都已经适配了AndroidX,不得不说真是很良心。

    在这里插入图片描述

    在这里插入图片描述

    4.迁移

    如果一个一个去替换当然很麻烦了,所以在Android Studio 3.2 Canary中添加了一键迁移的功能Refactor -> Migrate to AndroidX

    首先你的gradle版本至少为3.2.0以上,以及compileSdkVersion为28以上。

    classpath 'com.android.tools.build:gradle:3.2.0+'
    

    如果你是一个新项目,如果使用AndroidX相关依赖,需要在gradle.properties文件里添加配置:

    android.useAndroidX=true
    android.enableJetifier=true
    

    如果你想使用AndroidX,但是之前的不迁移,可以这样配置:

    android.useAndroidX=true
    android.enableJetifier=false
    

    5.参考

    当然迁移最好是出了正式版后在尝试。这里目的也就和标题一样,了解一下(坚决不做标题党哈)。


    19.02.12补充

    今天看到了butterknife的一个Issues

    在这里插入图片描述

    大意就是butterknife最新的10.0.0已经不支持老版库,如果需要使用,只能使用9.0.0这版。这也就是一种趋势,希望开源作者和使用者互相约束,共同推广AndroidX

    19.09.24补充

    Android Studio 3.5开始(可能更早吧),新建项目默认“强制”使用AndroidX。项目中的support依赖自动替换为AndroidX对应的依赖包。

    这主要是gradle.properties文件中的 android.enableJetifier=true在起作用。如果你想迁移到AndroidX,也可以添加这行配置,这样就不用担心之前开源项目未适配的情况。

    展开全文
  • 如果能在Android中使用离线的谷歌地图将是一件很爽的事情!按照如下步骤做吧!体验一下高潮来临的快感吧!哈哈!以下操作在windows下进行!安裝 Java 執行環境 (JRE 或 JDK,至少為 JRE v1.6.0_14 或更高版本)。...
  • android studio的安装,史上最详细(超多图)!!

    万次阅读 多人点赞 2020-09-21 17:41:30
    android studio的安装,史上最详细!!欢迎前来观看,感觉有用就点波关注吧!custom 欢迎前来观看,感觉有用就点波关注吧! 1、首先下载Android studio安装包,可以从 http://www.android-studio.org/ 下载最新...
  • Android简介及发展历程

    千次阅读 2020-07-30 19:43:50
    简介 Android是基于Linux系统的开源操作系统,是由Andy Rubin于2003年在美国加州创建,后被Google于2005年收购。在2008年的时候发布了第一部Android智能手机,随后Android不断发展更新,占据了全球大部分的手机市场...
  • Android简介

    千次阅读 多人点赞 2011-07-15 09:42:16
    Android简介一、用户角度 user’s perspectiveAndroid是一个操作系统,就像Windows一样,为用户和手机之间架起一道桥梁,协调和管理手机资源,让用户更方便的使用和控制手机硬件,如网络连接设备(Wifi, GPRS),...
  • Android入门教程 (一) Android简介和android studio安装

    千次阅读 多人点赞 2020-07-02 14:07:30
    写这篇文章,是为了让萌新们快速入门Android开发,同时讲述一下我对Android的理解,以及未来学习Android的规划,希望能够对大家有点参考价值。 Android是什么? Android就是跟苹果IOS一样,是一个操作系统。我们...
  • Android(一)-Android简介

    千次阅读 2012-10-29 15:10:19
    Android简介:  Android是基于Linux平台用Java语言开发的一种开放源代码的手机操作系统。  Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台...
  • ANDROID 一个开源的手机联盟项目 什么是ANDROIDANDROID是一个专用于移动设备的软件系统,它包括操作系统,中间件和关键应用,初略了解一下Android SDK提供必要的工具和API在Android平台上使用Java语言来开发应用
  • [002] Android系统简介

    万次阅读 2011-04-22 22:34:00
    Android简介Android是基于Linux内核的操作系统,是Google公司于2007年11月5日公布的智能手机操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。...
  • Kotlin是众多基于JVM的语言之一,它一开始是作为android 开发中java语言的可能的代替者出现的。java是世界上使用最多的语言之一,而伴随着其他语言的发展使得程序员编程越来越容易,
  • jdb 调试android 简介

    千次阅读 2017-08-11 14:34:03
    jdb 包含在jdk,使用jdb 之前需要先配置jdk的环境变量。 jdb 常用于三方apk 无源码动态调试,与其配合的工具为 baksmali、apkanalyser, 通过apkanalyser打印堆栈,理清楚正常情况下的代码流程。...
  • [019] Android平台调用WebService详解

    万次阅读 多人点赞 2011-11-24 21:37:29
    上篇文章已经对Web Service及其相关知识进行了介绍(Android开发之WebService介绍 ),相信有的朋友已经忍耐不住想试试在Android应用...Ksoap2-android简介  在Android平台调用Web Service需要依赖于第三方类库ksoap
1 2 3 4 5 ... 20
收藏数 87,950
精华内容 35,180
关键字:

android