java攻城狮之路(Android篇)--MP3、MP4、拍照、国际化、样式主题、图片移动和缩放

一、MP3播放器

查看Android API文档可以看到MediaPlayer状态转换图:

练习:

package com.shellway.mp3player;

import java.io.File;
import java.io.IOException;

import android.support.v7.app.ActionBarActivity;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {
    //媒体播放器
    private MediaPlayer mp;
    private EditText songName;
    //之前是否暂停过
    private boolean pause;
    private File file;
    private TelephonyManager tm;
    //暂停保存点
    private int position = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        songName = (EditText) findViewById(R.id.song_name);

        tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        tm.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
    }

    private class MyPhoneStateListener extends PhoneStateListener{
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            // TODO Auto-generated method stub
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE://闲置状态
                if (position > 0 && mp != null) {
                    //跳转到指定的保存点位置
                    mp.seekTo(position);
                    mp.start();
                }
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK://接听状态
                if(mp != null){
                    if(mp.isPlaying()){
                        position = mp.getCurrentPosition();
                        mp.pause();
                    }
                }
                break;
            case TelephonyManager.CALL_STATE_RINGING://响铃状态

                 if (mp.isPlaying()) {
                     position = mp.getCurrentPosition();
                     mp.pause();
                    }
                break;

            default:
                break;
            }
        }
    }
//这里是利用Activity生命周期的方法监听来电时暂停播放
//  @Override
//  protected void onResume() {
//      // TODO Auto-generated method stub
//      super.onResume();
//      if(position > 0){
//          //跳转到指定的位置
//          mp.seekTo(position);
//          mp.start();
//      }
//  }
//
//  @Override
//  protected void onPause() {
//      // TODO Auto-generated method stub
//      super.onPause();
//      position = mp.getCurrentPosition();
//      mp.pause();
//  }

    public void play(View view){
        String name = songName.getText().toString();

        file = new File(Environment.getExternalStorageDirectory(),name+".mp3");

            if (!file.exists()) {
                Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
                mp=null;
            }else{
                if (mp!=null) {
                    if (mp.isPlaying()) {
                        Toast.makeText(this, "歌曲已经在播放中", Toast.LENGTH_SHORT).show();
                    }else{
                        play();
                    }
                }else{
                    play();
                }
         }
    }

    public void play(){
        try {
            mp = new MediaPlayer();
            //置为初始状态
            mp.reset();
            //指定要播放的文件
            mp.setDataSource(file.getAbsolutePath());
            //准备(缓冲)
            mp.prepare();
            //设置缓冲完成监听
            mp.setOnPreparedListener(new MyOnPreparedListener());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private class MyOnPreparedListener implements OnPreparedListener{

        @Override
        public void onPrepared(MediaPlayer mp) {
            // TODO Auto-generated method stub
            //播放
            mp.start();
        }
    }

    public void pause(View view){
        if (mp.isPlaying()) {
            //暂停播放
            mp.pause();
            Button bt = (Button) view;
            bt.setText("继续");
            pause = true;
        }else{
            if (pause) {
                mp.start();
                Button bt = (Button) view;
                bt.setText("停止");
            }
        }
    }

    public void stop(View view){
        if (mp!=null) {
            //停止播放
            mp.stop();
        }
    }

    public void reset(View view){
        if (mp!=null) {
            mp.start();
        }
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        if (mp != null) {
            mp.release();
            mp = null;
        }
    }
}

MainActivity.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="请输入歌曲名" />
    <EditText
        android:id="@+id/song_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Complicated"
        />
  <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="play"
        android:text="播放"
        />
    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="pause"
        android:text="暂停"
        />
    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="stop"
        android:text="停止"
        />
    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="reset"
        android:text="重播"
        />
  </LinearLayout>
</LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.shellway.mp3player"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
    <!-- 监听来电状态需要读取电话状态权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

AndroidManifest.xml

运行结果截图:

二:MP4播放器

稍等,努力更新中。。。。

时间: 2024-10-10 02:18:24

java攻城狮之路(Android篇)--MP3、MP4、拍照、国际化、样式主题、图片移动和缩放的相关文章

java攻城狮之路(Android篇)--Activity生命

1 写一个类 extends Activity Activity是android的四大组件之一. Activity的激活分为显式意图激活和隐式意图激活. 如果一个activity希望别人隐式意图激活:则要配置过滤器1 action = ""2 有一个缺省的category,(可以有多个category),若不配置该类型会发生这样的一个错误:Caused by: android.content.ActivityNotFoundException: No Activity found to

java攻城狮之路(Android篇)--BroadcastReceiver&amp;Service

四大组件:activity 显示. contentProvider 对外暴露自己的数据给其他的应用程序.BroadcastReceiver 广播接收者,必须指定要接收的广播类型.必须明确的指定actionservice 服务,是运行后台,它是没有界面的.对某件事情进行监听. 一.广播:事件.普通广播: 是异步的.会广播接收者同时接收,不能被中断sendBroadcast()有序广播: 是同步的.会根据广播接收的优先级进行接收,是可以中断 短信到来广播 sendOrderBroadcast()-1

java攻城狮之路(Android篇)--ListView与ContentProvider

一.ListView 1.三种Adapter构建ListView ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种 BaseAdapter: 定义一个类继承BaseAdapter, 重写4个抽象方法, ListView的条目是由getView()方法构建出来的 SimpleAdapter: 创建SimpleAdapter对象时, 传入数据(List<Map<String, ?>>), 并指定数据的绑定

java攻城狮之路(Android篇)--与服务器交互

一.图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): package com.shellway.imagelooker; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedUR

java攻城狮之路(Android篇)--SQLite

一.Junit    1.怎么使用        在AndroidManifest.xml文件中进行配置, 在manifest借点下配置instrumentation, 在application借点下配置uses-library        定义类继承AndroidTestCast        定义测试方法, Run As JunitTest        如果需要判断测试结果, 可以使用Assert.assertEquals()方法. 下面是利用独立的测试工程JunitTest来测试工程J

java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子

一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_sdk_home环境变量解决.效果如下: 二.拨打电话 1.步骤 在Button节点中添加onClick属性, 指定一个方法名 在Activity中定义一个public void 方法名 (View view) 获取文本框中的号码 创建意图, 设置动作, 设置数据 使用意图开启Activity 2.

java攻城狮之路--复习JDBC

1.JDBC中如何获取数据库链接Connection? Driver 是一个接口: 数据库厂商必须提供实现的接口. 能从其中获取数据库连接. 可以通过 Driver 的实现类对象获取数据库连接. 1. 加入 mysql 驱动 1). 解压 mysql-connector-java-5.1.7.zip 2). 在当前项目下新建 lib 目录 3). 把 mysql-connector-java-5.1.7-bin.jar 复制到 lib 目录下 4). 右键 build-path , add to

java攻城狮之路--复习xml&amp;dom_pull编程续

本章节我们要学习XML三种解析方式: 1.JAXP DOM 解析2.JAXP SAX 解析3.XML PULL 进行 STAX 解析 XML 技术主要企业应用1.存储和传输数据 2.作为框架的配置文件 使用xml 存储和传输数据1.通过程序生成xml2.读取xml 中数据 ---- xml 解析 什么是DOM和SAX ?DOM Document Object Model ----- 文档对象模型 DOM思想: 将整个xml 加载内存中,形成文档对象,所有对xml操作都对内存中文档对象进行DOM

java攻城狮之路--复习xml&amp;dom_pull编程

xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后     把复选框勾去即可. 2.去掉打开Myeclipse时弹出的:Please allow Subclipse team to receive......办法: Windows-->Preferences-->General-->Startup and Shutdown-->取消Subclipse Usage