• 1.调用播放器播放本地视频 错误演示: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(Environment.getExternalStorageDirectory() + "/1.mp4"), "video/*"); startActivity...

    1.调用播放器播放本地视频

    错误演示:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.parse(Environment.getExternalStorageDirectory() + "/1.mp4"), "video/*");
    startActivity(intent);
    部分手机播放不了

    正确演示:

    Intent intent = new Intent(Intent.ACTION_VIEW);
    String path = Environment.getExternalStorageDirectory().getPath()+ "/1.mp4";//该路径可以自定义
    File file = new File(path);
    Uri uri = Uri.fromFile(file);
    intent.setDataAndType(uri, "video/*");
    startActivity(intent);


    2.调用播放器播放网络视频

    String url = "http://www.baidu.com/1.mp4";//示例,实际填你的网络视频链接
    String extension = MimeTypeMap.getFileExtensionFromUrl(url);
    String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    Intent mediaIntent = new Intent(Intent.ACTION_VIEW);
    mediaIntent.setDataAndType(Uri.parse(url), mimeType);
    startActivity(mediaIntent);

    展开全文
  • Android 播放系统提示音 Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); Ringtone rt = RingtoneManager.getRingtone(getApplicationContext(), uri); rt.play(); ...

    Android 播放系统提示音

    Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);  
    
    Ringtone rt = RingtoneManager.getRingtone(getApplicationContext(), uri);  
    
    rt.play();

     

    展开全文
  • 文章目录图形系统显示系统Buffer管理显示系统的架构从应用的角度理解Android Android图形显示子系统概述 Android图形显示系统,是Android比较重要的一个子系统,和很多其他子系统的关联紧密。想象一下,没有图形显示...


    Android图形显示子系统概述

    Android图形显示系统,是Android比较重要的一个子系统,和很多其他子系统的关联紧密。想象一下,没有图形显示系统的手机是什么样子,可能连对讲机都不如吧。图形显示系统比较复杂,从Android诞生到现在,几经修改,已经变的越来越庞大了。总的说来,图形显示系统可以分为两大部分来理解:

    • 图形系统
    • 显示系统

    图形系统

    图形系统也就是图形支持系统,提供绘图和图形处理支持。包括最初的2D绘图API Skia,后来的3D绘图API OpenGLES,RenderScript,OpenCV,到最近的Vulkan。也包括图片解码库,jpg,png,gif等。以及它们所需要的各种Driver支持。

    但是Android为了方便大家,我们在做应用开发的时候,并不用大家直接用各种API去绘制界面,也不用直接用解码库去解码。Android已经给大家提供了一个界面绘制机制,有很多widget和view,Android的应用开发者,用现有的widget就能够绘制出比较酷炫的界面。

    Android提供的大多view和widget都是2D的绘图,2D绘图比较慢,也发挥不出GPU的作用,因此Android又设计了一套加速系统,硬件加速。其目的就是将2D的绘图操作转换为一个个的3D(Opengl)绘图,再采用部分更新的方式,只去重绘界面中有更新的部分view,这样就大大提升界面绘制的速度。

    显示系统

    图形绘制好了后,需要送到LCD显示屏上,我们才能看到。绘制界面时,我们只关心单个界面,显示的时候,可能就有多个界面了。做过Android应该开发的都知道,我们需要继承一个Activity,用Activity呈现我们的界面。Activity的生命周期管理,也就伴随了窗口的管理。这中间就涉及了两个Android中两个主要的服务,AMS(ActivityManagerService)和WMS(WindowManagerService)。View,AMS,WMS可以说是整个上层显示系统的三驾马车。

    在Android中,一个窗口用一个Surface描述。多个窗口(窗口不一定都是Activity),需要同时显示,我们就需要将多个窗口进行合并。这就需要显示系统中重量级的服务SurfaceFlinger,Surfaceflinger控制窗口的合成,将多个窗口合并成一个,再送到LCD。

    Surfaceflinger是Native的服务,Surfaceflinger中怎么去描述一个窗口呢?Surfaceflinger采用图层的概念,即Layer。SurfaceFlinger合成,就是基于Display HAL的实现,将多个Layer合并。Display HAL,各个厂商的实现就千差万别了。

    Buffer管理

    前面讨论了怎么绘制,怎么显示。但是,绘制,绘在什么地方,拿什么去显示。答案只能是内存Buffer。Android的系统中,采用GraphicBuffer对buffer进行封装,而buffer采用ion实现,能在进程间共享。

    Surface属性应用进程,Layer属于SurfaceFlinger进程。如果只用一个Buffer,那么两个进程都有可能同时在用Buffer,这就可能会造成我们看到的屏幕显示不对,存在撕裂。另外,只用一个Buffer,效率也不高啊,绘制本来就是GPU在绘制,显示这边是CPU或者是其他的硬件模块,一个工作,另外一个不工作,且不浪费。所以Android采用Buffer队列的方式,即BufferQueue。绘制的是一个Buffer,显示的是一个buffer,各自处理完后,交换一下Buffer。这样效率就高很多了。这中间再采用一个生产者-消费者模型,Buffer是载体,Surface应用这边是Producer,SurfaceFlinger这边是是Consumer。这样就更好理解了。

    显示系统的架构

    有了前面的描述,是不是对Android的图形显示系统有了大概的认识了?没有关系,我们直接来看架构图。架构图来自Androd的官网, https://source.android.com/devices/graphics/ ,
    Android显示系统的架构

    大家可以对照图再回味一下,前面的描述。有些地方,这个图并不能很好的体现,不过没有关系,接下来我们会详细的介绍各个模块和流程。

    换一种方式来描述Android的显示系统,架构图如下:
    Android显示系统的架构

    再和前面Android的图进行对照,是不是更清楚一些了。

    这个图里,前面的描述里有点没有说到,SurfaceFlinger到OpenGLES,大家是不是觉得有点奇怪。其实是这样的,SurfaceFlinger合成,有两种方式,ClientDevice。Client就是Client合成完Layer后再将合成后的数据给到HWComposer,HWComposer此时做的工作很少,直接给到Display。Device则是将未合成的Layer,给到硬件合成的设备,合成完后再给到Display。

    可能大家还是很迷茫,没有关系~,我们接下来将参照Android的源码,逐一为大家讲解。

    从应用的角度理解Android

    做Android开发,我们都讲了太多的架构,也听了太多的架构。不知道大家有没有从应用的角度去看过Android的系统?我们先来看Android的整体系统架构。
    Android的整体系统架构

    Android基于Linux内核,我们是不是可以将上层Android理解为Linux内核的一个应用。这个应用非常庞大,集集了电话,BT,WiFi,音视频播放,Camera等功能。

    基于Linux内核的系统非常的多,比如常用的,Debian系列的Ubuntu,Debian;Redhat系统的RedHat,Fedora等。你可以理解Android自成一个系列。所以,我们也可以基于Linux内核去开发自己的系统。

    回到Android,Android在Linux中加了很多驱动,再采用硬件抽象的方式,向上提供接口,这就是我们所说的HAL层。所以我们要增加一个模块,需要增加Linux驱动,然后实现HAL,以供上层使用。当然,我们也可以基于Android的HAL去开发上层的系统,又可以将基于HAL的系统看成一个应用。据了解,FirefoxOS,360OS,YunOS等,基本都是基于Android的HAL的方式去开发的(Oops~如有亵渎,神灵保佑…)。

    基于HAL的Android Framework,分为Native Framework和JavaFramework。HAL层是C++写的,按里说,Native的 Framework应该就够了,什么还要去实现Java的Framework呢?Android的应用大多数都是用Java开发,中间还有一个Java虚拟机,和JNI。

    其实,这是有历史原因的。现在Android已经形成了一个很大的生态链,但是想想当初,Android系统刚才发布,得有开发者呀,没有开发者的支持,如何能形成生态链。所以,Android就采用了这种Java开发方式,大大笼络了Java开发人员。

    再回到我们的显示子系统,Surfaceflinger基于HAL HWComposer,管理和控制着整个Android的显示。而上层,则是WMS,AMS,View等系统服务管理和控制着整个Android的显示。

    回到上一章给出的Display架构图,我们是不是可以直接基于Native的Framework进行应用的开发呢,答案是肯定的。Android也为此提供了NDK,以便于Android Native应用的开发。

    下面,让我们从一个Native应用开始,揭开Android显示系统的面纱~

    展开全文
  • 如题,需要获取播放的音乐信息,原理是播放音乐的时候会发送四种广播,因此可以使用广播接收器拦截一下广播…… 但是!!!!当系统正在播放音乐的时候,我还不知道怎么获取音乐信息QAQ 要是哪位知道怎么获取,求...
    如题,需要获取播放的音乐信息,原理是播放音乐的时候会发送四种广播,因此可以使用广播接收器拦截一下广播……
    但是!!!!当系统正在播放音乐的时候,我还不知道怎么获取音乐信息QAQ
    要是哪位知道怎么获取,求告知QAQ
    
    
    MusicBroadcastReceiver mbr = null;
    
    class MusicBroadcastReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            artistName = intent.getStringExtra("artist");
            musicName = intent.getStringExtra("track");
            Log.d(TAG, "onReceive:    " + intent.toString());
            tvMainMusicArtist.setText("—  " + artistName + "  —");
            tvMainMusicName.setText(musicName);
    
            //此处是用来查看intent中包含的key
            Bundle bundle = intent.getExtras();
            Set<String> set = bundle.keySet();
            for (Iterator iterator = set.iterator(); iterator.hasNext(); ) {
                String key = (String) iterator.next();
                Object value = bundle.get(key);
                Log.i("IntentActivity", "key:" + key + " value:" + value);
            }
        }
    }

    注册一下广播

     @Override
        protected void onResume() {
    
            mbr = new MusicBroadcastReceiver();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("com.android.music.metachanged");
            intentFilter.addAction("com.android.music.queuechanged");
            intentFilter.addAction("com.android.music.playbackcomplete");
            intentFilter.addAction("com.android.music.playstatechanged");
    
            registerReceiver(mbr, intentFilter);
    
    
    }

    最后别忘了注销

    protected void onDestroy() {
            if (mbr != null) {
                unregisterReceiver(mbr);
            }
            super.onDestroy();
    }

    最后,附intent中的jian键值对:

    展开全文
  • 播放默认通知声音/** * 播放系统默认提示音 * * @return MediaPlayer对象 * * @throws Exception */ public void defaultMediaPlayer() throws Exception { Uri notification = RingtoneMana...

    播放默认通知声音

    /**
         * 播放系统默认提示音
         *
         * @return MediaPlayer对象
         *
         * @throws Exception
         */
        public void defaultMediaPlayer() throws Exception {
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            Ringtone r = RingtoneManager.getRingtone(mContext, notification);
            r.play();
        }

    播放默认来电铃声

    /**
         * 播放系统默认来电铃声
         *
         * @return MediaPlayer对象
         *
         * @throws Exception
         */
        public void defaultCallMediaPlayer() throws Exception {
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
            Ringtone r = RingtoneManager.getRingtone(mContext, notification);
            r.play();
        }
    播放默认闹钟铃声
     /**
         * 播放系统默认闹钟铃声
         *
         * @return MediaPlayer对象
         *
         * @throws Exception
         */
        public void defaultAlarmMediaPlayer() throws Exception {
            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
            Ringtone r = RingtoneManager.getRingtone(mContext, notification);
            r.play();
        }





    展开全文
  • 摘要: 大家最熟悉的Android系统应该是手机和平板设备上的,大部分人可能没想过Android系统和汽车有什么关系。但实际上,Android系统在四年前就在布局汽车这个平台。我最近对相关内容做了一些了解。下面将我所了解到...
  • android 视频播放,视频来源有两种:一种是本地视频,一种是网络视频,对android播放来说都统一用uri来表示。 播放视频有三种处理方式: (1) 使用webview 播放 (2) 使用videoview来播放 (3) 调用系统播放器来...
  • Android实现在线播放音乐 2014年3月10日 hello,小伙伴们,3月份珊珊来迟的第一篇博客,最近小巫在找工作,加上又生病了,就没有太多精力去写博客了。今天拖着病发表一篇之前已经实现的在线播放音乐效果,在线播放...
  • 公司的项目比较高大上,主要面对老外开发,所以要适配各种版本的Android机,项目里有个闹钟提醒患者吃药的功能,但是这个功能获取系统通知铃声在Android 6.0以下好好的,换了个7.0的手机却不能播放出声音了.Android的锅,...
  • Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);Ringtone rt = RingtoneManager.getRingtone(getApplicationContext(), uri);rt.play();
  • 底层系统服务是Android 框架裡接近Linux/Driver 的部分。为了充分发挥硬件设备的差異化特性,系统服务是让上层Java 应用程序來使用Driver/HW Device 特色的重要管道。于此,先仔细解析Java层系统服务的架构,然后...
  • Android播放音效

    2016-11-16 11:22:37
    Android通过SoundPool将文件音频缓存加载到内存中,然后在响应用户操作的时候快速地播放Android框架低通了SoundPool来解码小音频文件,并在内存中操作它们来进行音频快速和重复的播放。SoundPool还有一些其他...
  • 获取系统铃声列表: public ArrayList<Ringtone> listRingTone = new ArrayList<>(); void init(){ RingtoneManager ringtoneManager= new RingtoneManager(this); // 铃声管理器 Cursor cursor = ...
  • Intent intent = new Intent(android.content.Intent.ACTION_VIEW);...使用这个方法调用系统自带的播放器播放视频,除了三星其他手机都有用,三星手机调用这个方法之后直接卡住了,只能重启,求大神帮忙解答下
  • 昨天,从服务器下载一个AVI的视频,下载后需要进行播放,所以想调用系统自带的播放器。但是由于很少用到,所以自己当时不知道怎么写,于是在网上查找资料,最终是解决了问题。这里记录一下。一.网上的常见调用播放器...
  • 4.3定制Android平台系统通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品,从本节开始,我们从最原始的Android源码系统里一步一步定制出自己的Android系统。本节主要内容...
  • 理解Android系统(一)

    2015-01-06 18:16:58
    理解Android系统 Android 是业界流行的开源移动平台,受到广泛关注并为多个手机制造商作为手机的操作系统平台。由于它的开放性,市面上又出现了它的很多改良定制版本。且广泛的应用在手机、汽车、电脑等领域。因此...
  • 苹果系统下能播放Android系统就是不能播放,视频编码格式H.264都转过了也是不能播放。 在本地的IIS上搭建配置,用苹果手机和安卓手机浏览网页是可以正常播放视频的,放到服务器上安卓手机就播放不了,MIME类型也...
1 2 3 4 5 ... 20
收藏数 65,190
精华内容 26,076
关键字:

系统播放android