技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

Android Studio 初体验

        Google在I/O2013大会上发布了Android新的开发工具Android Studio,趁周末时间做了一下尝试。有需要的可以在http://developer.android.com/sdk/installing/studio.html下载,当前版本是V0.1。官方解释:Android Studio is a... 全文

Android Studio Android Studio环境搭建

自定义Android带图片的按钮

自定义Android带图片的按钮前言现在移动设备的按钮设计讲究大图标小文字,希望用户只要一看到图标便能知道这个按钮是干嘛的,但又要有必要的文字提示,最常见的就数搜索按钮了,上面一个大大的放大镜图标,下面两个字——搜索。Bill最近也在做具有这种效果的按钮,过程总是曲折的,不过结果总是美好滴~现在Bill把其做法分享给大家,希望对还不会的朋友有所帮助。先看看bill曲折的过程吧,也许里面就有你的影子:... 全文

android android应用

Android开发中屏保程序

有时候,需要在程序中实现屏保相关的功能,如指定一段时间后,显示自定义的屏保画面,网上查了很多资料,大多讲得不详细,或者说不完整。故对屏保相关的功能进行整理。... 全文

Android开发 Android屏保程序

Android开发之图形绘制

用OpenGL定义好要绘制的形状后,你就可能想把他们绘制在屏幕上。基于OpenGL ES 2.0绘制这些形状,需要的代码量比你想象中要多一点,这是因为2.0的API提供了大量对于图像渲染管道的控制。 这节课将会介绍如何使用OpenGL ES 2.0的API绘制你在前一节课定义好的形状。初始化形状... 全文

Android开发 Android图形绘制

adb: unknown host service问题

今天突然 adb启动不起来了百度了下, 说删除 豌豆荚, 或者 在 任务管理器 删除 adb.exe就可以了找了下,都没有, adb kill-server,  adb start-server都不行后面,关闭了杀毒, 维护的软件都不行。突然,发现了一个 tadb的进程, 我结束掉了, 再adb kill-server,  adb start-server 就 ok了... 全文

android Android ANDROID

Android应用开发

Android应用开发--MP3音乐播放器Service实现2013年5月29日简、美音乐播放器开发记录让网友们久等啦,关于简、美音乐播放器的开发,最重要的Service类总算是要发博了。关于Android五大组件之一的Service在音乐播放器开发中得到了很好的应用,不仅是Service,广播(Broadcast)、Activity、Content Provider都会在此次开发中用到。所以说对于Android的一个很好的练手项目,音乐播放器是毋庸置疑的。上一篇,主要介绍的是播放界面的业务逻辑实现,不过这些业务逻辑都是以Service为中心的。  package com.wwj.sb.service; import java.util.List; import android.annotation.SuppressLint; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Handler; import android.os.IBinder; import android.util.Log; import com.wwj.sb.activity.PlayerActivity; import com.wwj.sb.domain.AppConstant; import com.wwj.sb.domain.Mp3Info; import com.wwj.sb.utils.MediaUtil; /*** * 2013/5/25 * @author wwj * 音乐播放服务 */ @SuppressLint("NewApi") public class PlayerService extends Service { private MediaPlayer mediaPlayer; // 媒体播放器对象 private String path; // 音乐文件路径 private int msg; private boolean isPause; // 暂停状态 private int current = 0; // 记录当前正在播放的音乐 private List<Mp3Info> mp3Infos; //存放Mp3Info对象的集合 private int status = 3; //播放状态,默认为顺序播放 private MyReceiver myReceiver; //自定义广播接收器 private int currentTime; //当前播放进度 private int duration; //播放长度 //服务要发送的一些Action public static final String UPDATE_ACTION = "com.wwj.action.UPDATE_ACTION"; //更新动作 public static final String CTL_ACTION = "com.wwj.action.CTL_ACTION"; //控制动作 public static final String MUSIC_CURRENT = "com.wwj.action.MUSIC_CURRENT"; //当前音乐播放时间更新动作 public static final String MUSIC_DURATION = "com.wwj.action.MUSIC_DURATION";//新音乐长度更新动作 /** * handler用来接收消息,来发送广播更新播放时间 */ private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == 1) { if(mediaPlayer != null) { currentTime = mediaPlayer.getCurrentPosition(); // 获取当前音乐播放的位置 Intent intent = new Intent(); intent.setAction(MUSIC_CURRENT); intent.putExtra("currentTime", currentTime); sendBroadcast(intent); // 给PlayerActivity发送广播 handler.sendEmptyMessageDelayed(1, 1000); } } }; }; @Override public void onCreate() { super.onCreate(); Log.d("service", "service created"); mediaPlayer = new MediaPlayer(); mp3Infos = MediaUtil.getMp3Infos(PlayerService.this); /** * 设置音乐播放完成时的监听器 */ mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { if (status == 1) { // 单曲循环 mediaPlayer.start(); } else if (status == 2) { // 全部循环 current++; if(current > mp3Infos.size() - 1) { //变为第一首的位置继续播放 current = 0; } Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); path = mp3Infos.get(current).getUrl(); play(0); } else if (status == 3) { // 顺序播放 current++; //下一首位置 if (current <= mp3Infos.size() - 1) { Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); path = mp3Infos.get(current).getUrl(); play(0); }else { mediaPlayer.seekTo(0); current = 0; Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); } } else if(status == 4) { //随机播放 current = getRandomIndex(mp3Infos.size() - 1); System.out.println("currentIndex ->" + current); Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); path = mp3Infos.get(current).getUrl(); play(0); } } }); myReceiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(PlayerActivity.CTL_ACTION); registerReceiver(myReceiver, filter); } /** * 获取随机位置 * @param end * @return */ protected int getRandomIndex(int end) { int index = (int) (Math.random() * end); return index; } @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onStart(Intent intent, int startId) { path = intent.getStringExtra("url"); //歌曲路径 current = intent.getIntExtra("listPosition", -1); //当前播放歌曲的在mp3Infos的位置 msg = intent.getIntExtra("MSG", 0); //播放信息 if (msg == AppConstant.PlayerMsg.PLAY_MSG) { //直接播放音乐 play(0); } else if (msg == AppConstant.PlayerMsg.PAUSE_MSG) { //暂停 pause(); } else if (msg == AppConstant.PlayerMsg.STOP_MSG) { //停止 stop(); } else if (msg == AppConstant.PlayerMsg.CONTINUE_MSG) { //继续播放 resume(); } else if (msg == AppConstant.PlayerMsg.PRIVIOUS_MSG) { //上一首 previous(); } else if (msg == AppConstant.PlayerMsg.NEXT_MSG) { //下一首 next(); } else if (msg == AppConstant.PlayerMsg.PROGRESS_CHANGE) { //进度更新 currentTime = intent.getIntExtra("progress", -1); play(currentTime); } else if (msg == AppConstant.PlayerMsg.PLAYING_MSG) { handler.sendEmptyMessage(1); } super.onStart(intent, startId); } /** * 播放音乐 * * @param position */ private void play(int currentTime) { try { mediaPlayer.reset();// 把各项参数恢复到初始状态 mediaPlayer.setDataSource(path); mediaPlayer.prepare(); // 进行缓冲 mediaPlayer.setOnPreparedListener(new PreparedListener(currentTime));// 注册一个监听器 handler.sendEmptyMessage(1); } catch (Exception e) { e.printStackTrace(); } } /** * 暂停音乐 */ private void pause() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); isPause = true; } } private void resume() { if (isPause) { mediaPlayer.start(); isPause = false; } } /** * 上一首 */ private void previous() { Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); play(0); } /** * 下一首 */ private void next() { Intent sendIntent = new Intent(UPDATE_ACTION); sendIntent.putExtra("current", current); // 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); play(0); } /** * 停止音乐 */ private void stop() { if (mediaPlayer != null) { mediaPlayer.stop(); try { mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数 } catch (Exception e) { e.printStackTrace(); } } } @Override public void onDestroy() { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } } /** * * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放 * */ private final class PreparedListener implements OnPreparedListener { private int currentTime; public PreparedListener(int currentTime) { this.currentTime = currentTime; } @Override public void onPrepared(MediaPlayer mp) { mediaPlayer.start(); // 开始播放 if (currentTime > 0) { // 如果音乐不是从头播放 mediaPlayer.seekTo(currentTime); } Intent intent = new Intent(); intent.setAction(MUSIC_DURATION); duration = mediaPlayer.getDuration(); intent.putExtra("duration", duration); //通过Intent来传递歌曲的总长度 sendBroadcast(intent); } } public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int control = intent.getIntExtra("control", -1); switch (control) { case 1: status = 1; // 将播放状态置为1表示:单曲循环 break; case 2: status = 2; //将播放状态置为2表示:全部循环 break; case 3: status = 3; //将播放状态置为3表示:顺序播放 break; case 4: status = 4; //将播放状态置为4表示:随机播放 break; } } } } 以上的代码要注意的是在Service在被调用startService()方法会在回调onStart(),服务是不会被多次创建的,但会多次调用onStart方法,然而通过Intent传过来的数据,也只能在onStart方法内来接收。似乎关于Service类没什么可说的,简单来说服务是我们看不见的东西,只是在后台不断运行的程序,音乐播放通过服务来实现,才不会在界面不可见的时候停掉,这是音乐播放器使用Service的原因。第一阶段的音乐播放器开发已经到现在全部介绍完,第二阶段会实现歌词的显示和网络相关的下载和搜索,在这一阶段也会对UI进行一些细微的美化,尽量去尝试实现更炫的效果,比如提供主题的切换,界面切换的动画等等。小巫需要继续去学习,然后把所有东西分享给学习Android的朋友们,感谢你们的关注,让我们一起共同学习进步。第二阶段具体会什么时候启动,还没有明确的时间,因为最近开始忙起来了,所以尽情等待吧。哇咔咔... 全文

Android Android应用 音乐 mp3

Android

ToDoList(定制样式) 详解本文地址: http://blog.csdn.net/caroline_wendy/article/details/21330733Android允许从已有的视图工具箱(Widget Tool Box)派生子类 或 实现自己的视图控件;... 全文

Mystra Android Android Studio ToDoList 定制

Android

Exception raised during rendering: java.lang.System.arraycopy本文地址: http://blog.csdn.net/caroline_wendy... 全文

Mystra Android Exception Android SDK Location

Android

修改最小SDK版本(minSdkVersion)本文地址: http://blog.csdn.net/caroline_wendy/article/details/21241945版本: Android Studio 0.5.1因为Android的一些特定功能需要高版本的支持, 当最小SDK版本(minSdkVersion)过低时, 会出现报错, 所以要修改;如果在Eclipse中, 修改Manifest属性即可;... 全文

Mystra Android Android Studio minSdkVersion Gradle

Android inflate方法与 findViewById 方法区别

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。具体作用:1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。  ... 全文

android android应用

Android应用开发

Android应用开发--MP3音乐播放器代码实现(一)需求1:将内存卡中的MP3音乐读取出来并显示到列表当中... 全文

ANDROID Android应用 mp3 音乐

Android

ToDoList(fragment) 详解版权所有, 禁止转载, 如有需要, 请站内联系.本文地址: http://blog.csdn.net/caroline_wendy/article/details/21246963ToDoList做为Android的经典练习, 参考: http://blog.csdn.net/caroline_wendy/article/details/21223995... 全文

Mystra Android Android Studio ToDoList fragment

用Android App开发Andoird App

众位Android Devloper亲们,你们平时开发都用什么平台,什么工具呢?Windows? Mac OS? Linux? Eclipse ADT? IntelliJ Idea? 其实平台和工具什么的并不重要,因为Android本身就是“跨平台”的嘛。那么亲,你有没有琢磨过,用Andorid平台本身(也就是手机或者平板)来 开发Android应用呢?不管这么做是不是有实际意义,但是这个想法绝对是可行的!而且真的已经存在这样的工具了哦,这就是下面要介绍的——AIDE,一款运行在Android设备上的Java Android IDE。AIDE——Andoird Java IDE... 全文

Android开发 Android App

十大技巧优化Android App性能

无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的。那么,如何能开发出更高性能的Android App?相信是软件开发公司以及广大程序员们头疼的一大难题。今天,就给大家提供几个提高Android App性能的技巧。 高效地利用线程1.在后台取消一些线程中的动作我们知道App运行过程中所有的操作都默认在主线程(UI线程)中进行的,这样App的响应速度就会受到影响。会导致程序陷入卡顿、死掉甚至会发生系统错误。 为了加快响应速度,需要把费时的操作(比如网络请求、数据库操作或者复杂的计算)从主线程移动到一个单独的线程中。最高效的方式就是在类这一级完成 这项操作,可以使用AsyncTask或者IntentService来创建后台操作。如果选择使用IntentService,它会在需要的时候启动起 来,然后通过一个工作线程来处理请求(Intent)。 使用IntentService时需要注意以下几点限制:这个类不要给UI传递信息,如果要向用户展示处理结果信息请用Activity;每次只能处理一个请求;每一个处理请求过程都不能中断;2.保持响应不发生ANR... 全文

android app android开发

Android创建新项目及开发

创建一个新项目是很简单的,只要你安装了Eclipse插件,并且你的Eclipse软件版本在3.2或3.3,你就可以开始开发了。首先, 看一下要创建"Hello, World"程序从高级层面上有哪些步骤:1, 通过 File -> New -> Project 菜单,建立新项目"Android Project"2, 填写新项目各种参数。3, 编辑自动生成的代码模板。仅此而已,我们通过下面的详细说明来完成每个步骤。1、创建一个新的Android项目... 全文

Android创建项目 Android开发

Android应用

二维码的定义:二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。... 全文

Android开发 Android二维码生成 QR生成

ImageView、Bitmap的属性android:scaleType

1 imageView.setScaleType(ImageView.ScaleType.FIT_XY );   1 这里我们重点理解ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)。android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别: 2 3 CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示 4 5 CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽) 6 7 CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽 8 9 FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示1011 FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置1213 FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置1415 FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示1617 MATRIX / matrix 用矩阵来绘制 一开始我不明白MATRIX矩阵,网上搜索后发现原来MATRIX矩阵可以动态缩小放大图片来显示,这里不展开深入的了解,只是贴出相关语句,缩小图片:... 全文

android android应用

100多个Android Demo的整合

注:本例来自“安卓巴士”首先,这是实现的效果图这个例子几乎涵盖了Android的所有组件,以下截图是代码文件:由于代码文件太大,在这里不贴出源码,下面给出源码的下载地址,欢迎大家下载学习!... 全文

Android开发 android开发

7种形式的Android Dialog使用举例

在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一下,Android Dialog的类型无非也就7种,下面我分别向大家介绍这7种Android Dialog对话框的使用方法,希望对大家能有所帮助。1.该效果是当按返回按钮时弹出一个提示,来确保无误操作,采用常见的对话框样式。... 全文

Android Dialog Android