当前位置:  编程技术>移动开发
本页文章导读:
    ▪spring自各儿说说        spring自己说说 spring自己说说spring自己说说spring自己说说spring自己说说 ......
    ▪ Unbalanced calls to begin/end appearance transitions for <uivewcontroller&gt        Unbalanced calls to begin/end appearance transitions for <uivewcontroller> Unbalanced calls to begin/end appearance transitions for <uivewcontroller>原因就是上次动画还没结束,然后又开始了新的动画。  这样就.........
    ▪ 龟鉴 Mini音乐播放器       借鉴 Mini音乐播放器 继上篇音乐播放器,我们讲到使用 SDCard 播放音乐的例子,上篇也将如何在Android 模拟器中创建 SDCard 的步骤列了出来。本篇将扩展上篇例子,去获取SDCard 的所存内存,.........

[1]spring自各儿说说
    来源: 互联网  发布时间: 2014-02-18
spring自己说说
spring自己说说spring自己说说spring自己说说spring自己说说

    
[2] Unbalanced calls to begin/end appearance transitions for <uivewcontroller&gt
    来源: 互联网  发布时间: 2014-02-18
Unbalanced calls to begin/end appearance transitions for <uivewcontroller>
Unbalanced calls to begin/end appearance transitions for <uivewcontroller>

原因就是上次动画还没结束,然后又开始了新的动画。  这样就导致不能成功切换页面,而是一个白色无内容的页面。

出现unbalanced calls to begin/end appearance transitions for uiviewcontroller这样的log,其原因就是在容器类的UIViewController(如,UINavigationController, UITabBarController)中动画没做完,然后又开始新的动画.。解决办法就是让动画完后再做新的动画。

解决方法1:去掉动画
解决方法2:监听当前view的动画是否完成

解决方法就是,加一个BOOL型的变量,检查是否在做动画。

    if (transiting) {
        return;
    }
    transiting = YES;
    [self transitionFromViewController:_currentVC toViewController:newVC duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
       
    } completion:^(BOOL finished) {
       
        transiting = NO;
    }];

    
[3] 龟鉴 Mini音乐播放器
    来源: 互联网  发布时间: 2014-02-18
借鉴 Mini音乐播放器
继上篇音乐播放器,我们讲到使用 SDCard 播放音乐的例子,上篇也将如何在Android 模拟器中创建 SDCard 的步骤列了出来。本篇将扩展上篇例子,去获取SDCard 的所存内存,显示出来告诉用户。本篇讲述的内容如下:
  • 1、讲述 Environment 类。
  • 2、讲述 StatFs 类。
  • 3、完整例子读取 SDCard 内存

1、讲述 Environment 类Environment 是一个提供访问环境变量的类。Environment 包含常量:

  • MEDIA_BAD_REMOVAL
    解释:返回getExternalStorageState() ,表明SDCard 被卸载前己被移除
  • MEDIA_CHECKING
    解释:返回getExternalStorageState() ,表明对象正在磁盘检查。
  • MEDIA_MOUNTED
    解释:返回getExternalStorageState() ,表明对象是否存在并具有读/写权限
  • MEDIA_MOUNTED_READ_ONLY
    解释:返回getExternalStorageState() ,表明对象权限为只读
  • MEDIA_NOFS
    解释:返回getExternalStorageState() ,表明对象为空白或正在使用不受支持的文件系统。
  • MEDIA_REMOVED
    解释:返回getExternalStorageState() ,如果不存在 SDCard 返回
  • MEDIA_SHARED
    解释:返回getExternalStorageState() ,如果 SDCard 未安装 ,并通过 USB 大容量存储共享 返回
  • MEDIA_UNMOUNTABLE
    解释:返回getExternalStorageState() ,返回 SDCard 不可被安装 如果 SDCard 是存在但不可以被安装
  • MEDIA_UNMOUNTED
    解释:返回getExternalStorageState() ,返回 SDCard 已卸掉如果 SDCard 是存在但是没有被安装

Environment 常用方法:

  • 方法:getDataDirectory()
    解释:返回 File ,获取 Android 数据目录。
  • 方法:getDownloadCacheDirectory()
    解释:返回 File ,获取 Android 下载/缓存内容目录。
  • 方法:getExternalStorageDirectory()
    解释:返回 File ,获取外部存储目录即 SDCard
  • 方法:getExternalStoragePublicDirectory(String type)
    解释:返回 File ,取一个高端的公用的外部存储器目录来摆放某些类型的文件
  • 方法:getExternalStorageState()
    解释:返回 File ,获取外部存储设备的当前状态
  • 方法:getRootDirectory()
    解释:返回 File ,获取 Android 的根目录

2、讲述 StatFs 类StatFs 一个模拟linux的df命令的一个类,获得SD卡和手机内存的使用情况
StatFs 常用方法:

  • getAvailableBlocks()
    解释:返回 Int ,获取当前可用的存储空间
  • getBlockCount()
    解释:返回 Int ,获取该区域可用的文件系统数
  • getBlockSize()
    解释:返回 Int ,大小,以字节为单位,一个文件系统
  • getFreeBlocks()
    解释:返回 Int ,该块区域剩余的空间
  • restat(String path)
    解释:执行一个由该对象所引用的文件系统

3、完整例子读取 SDCard 内存存储卡在 Android 手机上是可以随时插拔的,每次的动作都对引起操作系统进行 ACTION_BROADCAST,本例子将使用上面学到的方法,计算出 SDCard 的剩余容量和总容量。代码如下:


下面是图例显示 MediaPlayer 的生命周期


3.1、MediaPlayer 常用方法介绍

  • 方法:create(Context context, Uri uri)
    解释:静态方法,通过Uri创建一个多媒体播放器。
  • 方法:create(Context context, int resid)
    解释:静态方法,通过资源ID创建一个多媒体播放器
  • 方法:create(Context context, Uri uri, SurfaceHolder holder)
    解释:静态方法,通过Uri和指定 SurfaceHolder 【抽象类】 创建一个多媒体播放器
  • 方法: getCurrentPosition()
    解释:返回 Int, 得到当前播放位置
  • 方法: getDuration()
    解释:返回 Int,得到文件的时间
  • 方法:getVideoHeight()
    解释:返回 Int ,得到视频的高度
  • 方法:getVideoWidth()
    解释:返回 Int,得到视频的宽度
  • 方法:isLooping()
    解释:返回 boolean ,是否循环播放
  • 方法:isPlaying()
    解释:返回 boolean,是否正在播放
  • 方法:pause()
    解释:无返回值 ,暂停
  • 方法:prepare()
    解释:无返回值,准备同步
  • 方法:prepareAsync()
    解释:无返回值,准备异步
  • 方法:release()
    解释:无返回值,释放 MediaPlayer 对象
  • 方法:reset()
    解释:无返回值,重置 MediaPlayer 对象
  • 方法:seekTo(int msec)
    解释:无返回值,指定播放的位置(以毫秒为单位的时间)
  • 方法:setAudioStreamType(int streamtype)
    解释:无返回值,指定流媒体的类型
  • 方法:setDataSource(String path)
    解释:无返回值,设置多媒体数据来源【根据 路径】
  • 方法:setDataSource(FileDescriptor fd, long offset, long length)
    解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】
  • 方法:setDataSource(FileDescriptor fd)
    解释:无返回值,设置多媒体数据来源【根据 FileDescriptor】
  • 方法:setDataSource(Context context, Uri uri)
    解释:无返回值,设置多媒体数据来源【根据 Uri】
  • 方法:setDisplay(SurfaceHolder sh)
    解释:无返回值,设置用 SurfaceHolder 来显示多媒体
  • 方法:setLooping(boolean looping)
    解释:无返回值,设置是否循环播放
  • 事件:setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)
    解释:监听事件,网络流媒体的缓冲监听
  • 事件:setOnCompletionListener(MediaPlayer.OnCompletionListener listener)
    解释:监听事件,网络流媒体播放结束监听
  • 事件:setOnErrorListener(MediaPlayer.OnErrorListener listener)
    解释:监听事件,设置错误信息监听
  • 事件:setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)
    解释:监听事件,视频尺寸监听
  • 方法:setScreenOnWhilePlaying(boolean screenOn)
    解释:无返回值,设置是否使用 SurfaceHolder 显示
  • 方法:setVolume(float leftVolume, float rightVolume)
    解释:无返回值,设置音量
  • 方法:start()
    解释:无返回值,开始播放
  • 方法:stop()
    解释:无返回值,停止播放

4、完整音乐播放例子演示通过上面的讲解大致知道了 MediaPlayer 的播放原理,下面我们来完成一个小项目,即实现一个 Mini 版音乐播放器。这个播放器中我们需要有暂停、停止、上一首、下一首等基本按钮,有了上面的讲解要实现这个小项目就轻松多了,下面将贴出代码

  • import java.io.File;
  • import java.io.FilenameFilter;[/font]
  • public class MusicFilter implements FilenameFilter{
  • @Override
  • public boolean accept(File dir, String filename) {
  • // TODO Auto-generated method stub
  • return (filename.endsWith(".mp3"));
  • }
  • }
  • 复制代码

    Tip:播放器不可能只是希望播放一种音乐格式,并且还需要自动识别指定的路径中哪些是可以播放的音频文件,哪些是不支持的格式,以上代码可以作为参考。好了,下面贴出完整代码

  • package com.terry;
  • import java.io.File;
  • import java.util.ArrayList;
  • import java.util.List;
  • import android.app.ListActivity;
  • import android.media.MediaPlayer;
  • import android.media.MediaPlayer.OnCompletionListener;
  • import android.os.Bundle;
  • import android.view.KeyEvent;
  • import android.view.View;
  • import android.view.View.OnClickListener;
  • import android.widget.ArrayAdapter;
  • import android.widget.Button;
  • import android.widget.ListView;
  • import android.widget.Toast;
  • public class musicActivity extends ListActivity {
  • //播放对象
  • private MediaPlayer myMediaPlayer;
  • //播放列表
  • private List<String> myMusicList=new ArrayList<String>();
  • //当前播放歌曲的索引
  • private int currentListItem=0;
  • //音乐的路径
  • private static final String MUSIC_PATH=new String("/sdcard/");
  • /** Called when the activity is first created. */
  • @Override
  • public void onCreate(Bundle savedInstanceState) {
  • super.onCreate(savedInstanceState);
  • setContentView(R.layout.main);
  • myMediaPlayer=new MediaPlayer();
  • findView();
  • musicList();
  • listener();
  • }
  • //绑定音乐
  • void musicList(){
  • File home=new File(MUSIC_PATH);
  • if(home.listFiles(new MusicFilter()).length>0){
  • for(File file:home.listFiles(new MusicFilter())){
  • myMusicList.add(file.getName());
  • }
  • ArrayAdapter<String> musicList=new ArrayAdapter<String>
  • (musicActivity.this,R.layout.musicitme, myMusicList);
  • setListAdapter(musicList);
  • }
  • }
  • //获取按钮
  • void findView(){
  • viewHolder.start=(Button)findViewById(R.id.start);
  • viewHolder.stop=(Button)findViewById(R.id.stop);
  • viewHolder.next=(Button)findViewById(R.id.next);
  • viewHolder.pause=(Button)findViewById(R.id.pause);
  • viewHolder.last=(Button)findViewById(R.id.last);
  • }
  • //监听事件
  • void listener(){
  • //停止
  • viewHolder.stop.setOnClickListener(new OnClickListener() {
  • @Override
  • public void onClick(View v) {
  • // TODO Auto-generated method stub
  • if(myMediaPlayer.isPlaying()){
  • myMediaPlayer.reset();
  • }
  • }
  • });
  • //开始
  • viewHolder.start.setOnClickListener(new OnClickListener() {
  • @Override
  • public void onClick(View v) {
  • // TODO Auto-generated method stub
  • playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  • }
  • });
  • //下一首
  • viewHolder.next.setOnClickListener(new OnClickListener() {
  • @Override
  • public void onClick(View v) {
  • // TODO Auto-generated method stub
  • nextMusic();
  • }
  • });
  • //暂停
  • viewHolder.pause.setOnClickListener(new OnClickListener() {
  • @Override
  • public void onClick(View v) {
  • // TODO Auto-generated method stub
  • if(myMediaPlayer.isPlaying()){
  • myMediaPlayer.pause();
  • }else{
  • myMediaPlayer.start();
  • }
  • }
  • });
  • //上一首
  • viewHolder.last.setOnClickListener(new OnClickListener() {
  • @Override
  • public void onClick(View v) {
  • // TODO Auto-generated method stub
  • lastMusic();
  • }
  • });
  • }
  • //播放音乐
  • void playMusic(String path){
  • try {
  • myMediaPlayer.reset();
  • myMediaPlayer.setDataSource(path);
  • myMediaPlayer.prepare();
  • myMediaPlayer.start();
  • myMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
  • @Override
  • public void onCompletion(MediaPlayer mp) {
  • // TODO Auto-generated method stub
  • nextMusic();
  • }
  • });
  • } catch (Exception e) {
  • // TODO: handle exception
  • e.printStackTrace();
  • }
  • }
  • //下一首
  • void nextMusic(){
  • if(++currentListItem>=myMusicList.size()){
  • currentListItem=0;
  • }
  • else{
  • playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  • }
  • }
  • //上一首
  • void lastMusic(){
  • if(currentListItem!=0)
  • {
  • if(--currentListItem>=0){
  • currentListItem=myMusicList.size();
  • } else{
  • playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  • }
  • } else{
  • playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  • }
  • }
  • //当用户返回时结束音乐并释放音乐对象
  • @Override
  • public boolean onKeyDown(int keyCode, KeyEvent event) {
  • // TODO Auto-generated method stub
  • if(keyCode==KeyEvent.KEYCODE_BACK){
  • myMediaPlayer.stop();
  • myMediaPlayer.release();
  • this.finish();
  • return true;
  • }
  • return super.onKeyDown(keyCode, event);
  • }
  • //当选择列表项时播放音乐
  • @Override
  • protected void onListItemClick(ListView l, View v, int position, long id) {
  • // TODO Auto-generated method stub
  • currentListItem=position;
  • playMusic(MUSIC_PATH+myMusicList.get(currentListItem));
  • }
  • }

  •     
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3