Author Archives: 宗, 博洋

大字体模式适配文档

     MIUI 7的设计理念是『为你设计』,针对不同的人群推出了不同的适配功能。『大字体模式』即为MIUI7上的重点功能点。

 

系统的『字体大小』(设置-字体大小)分为以下几档:

  • 标准,sp值放大1.0
  • 中号,sp值放大1.15
  • 大号,sp值放大至1.32
  • 超大,sp值放大至1.40
  • 巨无霸,sp值放大值1.40,仅针对特定的系统应用(电话、短信及联系人)做提供接口

Continue reading

MIUI系统音乐控件标准化方案,第三方APP接入指南

1 功能概述

MIUI提供了强大的系统音乐控件来优化用户体验,系统通过通知栏、桌面小控件、锁屏等方式来展示正在播放的歌曲信息,同时以更为便捷的方式来控制音乐播放器。

第三方音乐播放器可以通过本文所述的接口将正在播放的歌曲信息显示在系统控件上,并接收系统的控制请求(上一首歌、下一首歌,播放、暂停)。

2 使用方法说明

2.1 采用Android原生RemoteControlClient

      Android自带了向系统控件设置歌曲名、歌手名、专辑名等信息的功能,在此基础上MIUI添加了设置歌词的功能,在与Android原有功能兼容的基础上进行扩展。

2.2 app如何接收到控件发出的命令

2.2.1注册接收系统控制请求的BoardCastReceiver与RemoteControlClient

 

 

注册Receiver与RemoteControlClient
ComponentName myEventReceiver = new ComponentName(getPackageName(), MyRemoteControlEventReceiver.class.getName());
  // MyRemoteControlEventReceiver是一个接收系统控件请求的BoardCastReceiver,需要在manifest中进行注册
       /* <receiver android:name=".receiver.MediaButtonIntentReceiver">
          <intent-filter >
             <action android:name="android.intent.action.MEDIA_BUTTON" />
          </intent-filter>
          </receiver>*/
 AudioManager myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
  // 需要向AudioManager注册
 myAudioManager.registerMediaButtonEventReceiver(myEventReceiver);
 // build the PendingIntent for the remote control client
 Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
 mediaButtonIntent.setComponent(myEventReceiver);
 PendingIntent mediaPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, mediaButtonIntent, 0);
 // create and register the remote control client
 RemoteControlClient myRemoteControlClient = new RemoteControlClient(mediaPendingIntent);
  // 在AudioManager中注册RemoteControlClient
 myAudioManager.registerRemoteControlClient(myRemoteControlClient);

 

   摘自官方文档:http://developer.android.com/reference/android/media/RemoteControlClient.html

注意:在退出app时需要及时注销receiver与RemoteControlClient

myAudioManager.unregisterRemoteControlClient(myRemoteControlClient);
myAudioManager.unregisterMediaButtonEventReceiver(myEventReceiver);

2.2.2 声明支持系统控件的操作

//设置所支持的系统操作,下面的例子中支持了上一首,下一首,播放,暂停,播放/暂停, 评分(收藏)
int flags = RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS
             | RemoteControlClient.FLAG_KEY_MEDIA_NEXT
             | RemoteControlClient.FLAG_KEY_MEDIA_PLAY
             | RemoteControlClient.FLAG_KEY_MEDIA_PAUSE
             | RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE
             | RemoteControlClient.FLAG_KEY_MEDIA_RATING;
mRemoteControlClient.setTransportControlFlags(flags);

2.2.3 注册listener监听系统发出的进度更新请求

mRemoteControlClient.setOnGetPlaybackPositionListener(new OnGetPlaybackPositionListener() {
    @Override
    public long onGetPlaybackPosition() {
        return 返回你的播放进度;
    }
});

2.2.4 注册listener监听系统发出的用户评分信息

mRemoteControlClient.setMetadataUpdateListener(new OnMetadataUpdateListener() {
    @Override
    public void onMetadataUpdate(int key, Object newValue) {
        处理评分信息
    }
});

摘自官方文档:http://developer.android.com/about/versions/android-4.4.html#Ratings

 

2.3 app如何将信息显示到控件

2.3.1 静态歌曲信息

发送的信息常用的有:歌曲名、专辑名、歌手名,播放时常,在播放列表中的歌曲序号,播放列表中的总歌曲数,歌曲封面。

// 要向系统控件发送上述信息,需要创建一个MetadataEditor
  RemoteControlClient.MetadataEditor ed = mRemoteControlClient.editMetadata(true);
 // 创建时传入的布尔值参数,指示本次传入的数据是否附加在之前传入的数据一起传给系统,一般来说,换歌了才需要将其设置为true
 // 向系统传入歌曲信息
 ed.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, 歌曲名);
 ed.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, 专辑名);
 ed.putString(MediaMetadataRetriever.METADATA_KEY_ARTIST, 歌手名);
 ed.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, 歌曲时长);
 ed.putLong(MediaMetadataRetriever.METADATA_KEY_CD_TRACK_NUMBER, 歌曲在播放列表中的位置);
 ed.putLong(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS, 歌曲列表的长度);
 ed.putBitmap(MetadataEditor.BITMAP_KEY_ARTWORK, 歌曲封面);
 ed.putObject(MediaMetadataEditor.RATING_KEY_BY_USER, 评分(参考Rating类,目前只支持RATING_HEART类型));
 ed.apply();
 // MIUI在此基础上提供了发送歌词信息的接口,第三方app需将符合规范的.lrc文件读取成字符串直接传入即可,系统会自己解析歌词
 // MIUI应用使用方法,MediaMetadataRetriever.METADATA_KEY_LYRIC是MIUI自己定义的字段,其值为1000
  ed.putString(MediaMetadataRetriever.METADATA_KEY_LYRIC, 歌词);
 // 第三方app使用方法,1000这个字段是MIUI定义的传输歌词的字段
   try {
      // for MIUI support
       ed.putString(1000, 歌词);
       catch (Exception e) {}

注意:发现这套传输信息的机制有一个bug,在切歌的时候,需要将MetadataEditor中曾经put过值的key(歌曲封面除外),重新put一遍,

          如果没有新值可以传入null,不然上一首歌的信息与新歌的信息会混在一起。

2.3.2 歌曲动态信息

向系统发送播放状态

可以顺带传入播放进度的信息
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_BUFFERING, position(), 1);//状态为加载中
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING, position(), 1);//状态为播放
mRemoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED);//状态为暂停

向系统发送播放进度,让系统能够实时监听到app的播放进度

mRemoteControlClient.setOnGetPlaybackPositionListener(new OnGetPlaybackPositionListener() {
    @Override
    public long onGetPlaybackPosition() {
        return 返回你的播放进度;
    }
});

注册listener监听系统发出的进度更新请求

mRemoteControlClient.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener() {
    @Override
    public void onPlaybackPositionUpdate(long newPositionMs) {
        //设置app播放器的播放进度;
    }
});

相关资料摘自官方文档:

http://developer.android.com/reference/android/media/RemoteControlClient.html

如果您有疑问可以邮件至 nirui@xiaomi.com

文件过滤以及芯片支持的技术文档

Android的所有应用,都可以通过其中的AndroidManifest.xml文件中的<supports-gl-texture>标签声明该apk文件支持的gl-texture。

同时,设备根据GPU的不同支持的gl-texture也不相同。

小米手机3TD版小米平板使用的是NVDIA的显卡,apk的supports-gl-texture声明中至少有一个texture是该设备支持的texture。这也是该apk在小米应用商店中不被过滤,可以被现实的前提。

  • 小米平板支持的gl-texture
GL_EXT_color_buffer_half_float, 
GL_EXT_debug_label, 
GL_EXT_debug_marker, 
GL_EXT_map_buffer_range, 
GL_EXT_robustness, 
GL_EXT_texture_compression_dxt1, 
GL_EXT_texture_compression_s3tc, 
GL_EXT_texture_format_BGRA8888, 
GL_EXT_unpack_subimage, 
GL_KHR_debug, 
GL_NV_bgr, 
GL_NV_secure_context, 
GL_NV_texture_compression_s3tc, 
GL_OES_EGL_image, 
GL_OES_EGL_image_external, 
GL_OES_EGL_sync, 
GL_OES_compressed_ETC1_RGB8_texture, 
GL_OES_compressed_paletted_texture,
GL_OES_draw_texture, 
GL_OES_element_index_uint, 
GL_OES_fbo_render_mipmap, 
GL_OES_framebuffer_object, 
GL_OES_matrix_get, 
GL_OES_packed_depth_stencil, 
GL_OES_point_size_array, 
GL_OES_point_sprite, 
GL_OES_read_format, 
GL_OES_rgb8_rgba8, 
GL_OES_stencil8, 
GL_OES_texture_cube_map, 
GL_OES_texture_npot, 
GL_OES_vertex_half_float,
  • 小米手机3 TD版支持的gl-texture
GL_EXT_bgra,
GL_EXT_debug_label, 
GL_EXT_debug_marker, 
GL_EXT_texture_compression_dxt1, 
GL_EXT_texture_compression_s3tc, 
GL_EXT_texture_format_BGRA8888, 
GL_EXT_unpack_subimage, 
GL_NV_texture_npot_2D_mipamap, 
GL_OES_EGL_image, 
GL_OES_EGL_image_external, 
GL_OES_EGL_sync, 
GL_OES_byte_coordinates, 
GL_OES_compressed_ETC1_RGB8_texture,
GL_OES_compressed_paletted_texture,
GL_OES_draw_texture, 
GL_OES_extended_matrix_palette, 
GL_OES_fbo_render_mipmap,
GL_OES_fixes_point, 
GL_OES_framebuffer_object, 
GL_OES_matrix_get, 
GL_OES_matrix_palette,
GL_OES_point_size_array, 
GL_OES_point_sprite, 
GL_OER_query_martrix,
GL_OES_read_format, 
GL_OES_rgb8_rgba8, 
GL_OES_single_precision,
GL_OES_stencil8, 
GL_OES_texture_cube_map, 
GL_OES_vertex_half_float,

为什么我在搜索我应用的tag关键字的时候搜索不到我们的应用?

  • 开发者提交的tag关键字,后台系统会自动进行过滤,将非法tag(竞品名称、无关tag)过滤掉。
  • 没有被过滤掉的才是您应用的有效tag
  • 有效tag在搜索排序时存在结果排行,并且会只显示较为靠前的搜索结果。为了提升用户体验,我们并不会把所有的拥有有效tag的应用都展示给用户
  • 当然,tag关键字的搜索结果每个市场都是略有不同,但算法是绝对公平公正的,我们也在不断的优化和完善中

我在提交应用更新、修改描述的时候线上的应用是否可以正常下载?更新的机制是怎样的?

小米应用商店的更新机制如下:

  • 当提交了新的版本的审核申请,线上的版本依然可以正常下载
  • 新的版本审核通过后,线上将直接替换掉旧的版本,并提示已经按照了旧版本的用户进行更新
  • 同时新的用户下载到的也是最新的版本

进行应用更新、信息变更过程中和审核未通过都不会影响线上应用的下载。