1 编写以下案例:

当点击了”播放”之后,在手机上的/mnt/sdcard2/natural.mp3就会播放。

2 编写布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

<EditText

android:id="@+id/et_path"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

        android:hint="请输入要播放文件的路径" />

<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal" >

<Button

android:id="@+id/bt_play"

android:onClick="play"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

            android:text="播放" />

<Button

android:id="@+id/bt_pause"

android:onClick="pause"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

            android:text="暂停" />

<Button

android:id="@+id/bt_stop"

android:onClick="stop"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

            android:text="停止" />

<Button

android:id="@+id/bt_replay"

android:onClick="replay"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

            android:text="重播" />

</LinearLayout>

</LinearLayout>

3 编写MainActivity

package com.itheima.musicplayer;

import java.io.File;

import java.io.IOException;

import android.app.Activity;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnCompletionListener;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class MainActivity extends Activity {

private EditText et_path;

private MediaPlayer mediaPlayer;

private Button bt_play,bt_pause,bt_stop,bt_replay;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

et_path = (EditText) findViewById(R.id.et_path);

bt_play = (Button) findViewById(R.id.bt_play);

bt_pause = (Button) findViewById(R.id.bt_pause);

bt_stop = (Button) findViewById(R.id.bt_stop);

bt_replay = (Button) findViewById(R.id.bt_replay);

}

/**

* 播放

* @param view

*/

public void play(View view) {

String filepath = et_path.getText().toString().trim();

File file = new File(filepath);

if(file.exists()){

try {

mediaPlayer = new MediaPlayer();

mediaPlayer.setDataSource(filepath);//设置播放的数据源。

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mediaPlayer.prepare();//准备开始播放 播放的逻辑是c代码在新的线程里面执行。

mediaPlayer.start();

bt_play.setEnabled(false);

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

bt_play.setEnabled(true);

}

});

} catch (Exception e) {

e.printStackTrace();

Toast.makeText(this, "播放失败", 0).show();

}

}else{

Toast.makeText(this, "文件不存在,请检查文件的路径", 0).show();

}

}

/**

* 暂停

* @param view

*/

public void pause(View view) {

if("继续".equals(bt_pause.getText().toString())){

mediaPlayer.start();

bt_pause.setText("暂停");

return;

}

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

//这里表示的是暂停功能

mediaPlayer.pause();

bt_pause.setText("继续");

}

}

/**

* 停止

* @param view

*/

public void stop(View view) {

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

//通过stop方法停止播放音乐

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

}

bt_pause.setText("暂停");

bt_play.setEnabled(true);

}

/**

* 重播

* @param view

*/

public void replay(View view) {

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

//通过seekTo方法指定到某个位置播放音乐

mediaPlayer.seekTo(0);

}else{

play(view);

}

bt_pause.setText("暂停");

}

}

如果想播放网络上的音乐,需要把上面的play代码改成:

/**

* 播放

*

* @param view

*/

public void play(View view) {

String filepath = et_path.getText().toString().trim();

// http://

if (filepath.startsWith("http://")) {

try {

mediaPlayer = new MediaPlayer();

mediaPlayer.setDataSource(filepath);// 设置播放的数据源。

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

// mediaPlayer.prepare();//同步的准备方法。

mediaPlayer.prepareAsync();// 异步的准备

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

@Override

public void onPrepared(MediaPlayer mp) {

mediaPlayer.start();

bt_play.setEnabled(false);

}

});

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

bt_play.setEnabled(true);

}

});

} catch (Exception e) {

e.printStackTrace();

Toast.makeText(this, "播放失败", 0).show();

}

        } else {

Toast.makeText(this, "请检查文件的路径", 0).show();

}

}

==============================================================================

  1. 视频播放器,实现”播放”、“暂停”、”停止”、“重播”。案例截图如下:

  1. 播放布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

<EditText

android:id="@+id/et_path"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:hint="请输入要播放文件的路径" />

<SeekBar

android:id="@+id/seekBar1"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal" >

<Button

android:id="@+id/bt_play"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="play"

android:text="播放" />

<Button

android:id="@+id/bt_pause"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="pause"

android:text="暂停" />

<Button

android:id="@+id/bt_stop"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="stop"

android:text="停止" />

<Button

android:id="@+id/bt_replay"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="replay"

android:text="重播" />

</LinearLayout>

<SurfaceView

android:id="@+id/sv"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />

</LinearLayout>

  1. 编写MainActivity,代码如下:

package com.itheima.musicplayer;

import java.io.File;

import java.io.IOException;

import java.util.Timer;

import java.util.TimerTask;

import android.app.Activity;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnCompletionListener;

import android.os.Bundle;

import android.view.SurfaceHolder;

import android.view.SurfaceHolder.Callback;

import android.view.SurfaceView;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.SeekBar;

import android.widget.SeekBar.OnSeekBarChangeListener;

import android.widget.Toast;

public class MainActivity extends Activity {

private EditText et_path;

private MediaPlayer mediaPlayer;

private Button bt_play,bt_pause,bt_stop,bt_replay;

private SurfaceView sv;

private SurfaceHolder holder;

private int position;

private String filepath;

private SeekBar seekBar1;

private Timer timer;

private TimerTask task;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

et_path = (EditText) findViewById(R.id.et_path);

bt_play = (Button) findViewById(R.id.bt_play);

bt_pause = (Button) findViewById(R.id.bt_pause);

bt_stop = (Button) findViewById(R.id.bt_stop);

bt_replay = (Button) findViewById(R.id.bt_replay);

seekBar1 = (SeekBar) findViewById(R.id.seekBar1);

seekBar1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

@Override

public void onStopTrackingTouch(SeekBar seekBar) {

int postion = seekBar.getProgress();

mediaPlayer.seekTo(postion);

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override

public void onProgressChanged(SeekBar seekBar, int progress,

boolean fromUser) {

}

});

//得到surfaceview

sv = (SurfaceView) findViewById(R.id.sv);

//得到显示界面内容的容器

holder = sv.getHolder();

//在低版本模拟器上运行记得加上下面的参数。不自己维护双缓冲区,而是等待多媒体播放框架主动的推送数据。

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

holder.addCallback(new Callback() {

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

System.out.println("destoryed");

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

position = mediaPlayer.getCurrentPosition();

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

timer.cancel();

task.cancel();

timer = null;

task = null;

}

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

System.out.println("created");

if(position>0){//记录的有播放进度。

try {

mediaPlayer = new MediaPlayer();

mediaPlayer.setDataSource(filepath);//设置播放的数据源。

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mediaPlayer.setDisplay(holder);

mediaPlayer.prepare();//准备开始播放 播放的逻辑是c代码在新的线程里面执行。

mediaPlayer.start();

mediaPlayer.seekTo(position);

bt_play.setEnabled(false);

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

bt_play.setEnabled(true);

}

});

int max = mediaPlayer.getDuration();

seekBar1.setMax(max);

timer = new Timer();

task = new TimerTask() {

@Override

public void run() {

seekBar1.setProgress(mediaPlayer.getCurrentPosition());

}

};

timer.schedule(task, 0, 500);

} catch (IOException e) {

e.printStackTrace();

}

}

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

System.out.println("changed");

}

});

}

/**

* 播放

* @param view

*/

public void play(View view) {

filepath = et_path.getText().toString().trim();

File file = new File(filepath);

if(file.exists()){

try {

mediaPlayer = new MediaPlayer();

mediaPlayer.setDataSource(filepath);//设置播放的数据源。

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mediaPlayer.setDisplay(holder);

mediaPlayer.prepare();//准备开始播放 播放的逻辑是c代码在新的线程里面执行。

mediaPlayer.start();

//设置拖动进度条的最大值

int max = mediaPlayer.getDuration();

seekBar1.setMax(max);

timer = new Timer();

task = new TimerTask() {

@Override

public void run() {

seekBar1.setProgress(mediaPlayer.getCurrentPosition());

}

};

timer.schedule(task, 0, 500);

bt_play.setEnabled(false);

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

bt_play.setEnabled(true);

}

});

} catch (Exception e) {

e.printStackTrace();

Toast.makeText(this, "播放失败", 0).show();

}

}else{

Toast.makeText(this, "文件不存在,请检查文件的路径", 0).show();

}

}

/**

* 暂停

* @param view

*/

public void pause(View view) {

if("继续".equals(bt_pause.getText().toString())){

mediaPlayer.start();

bt_pause.setText("暂停");

return;

}

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

mediaPlayer.pause();

bt_pause.setText("继续");

}

}

/**

* 停止

* @param view

*/

public void stop(View view) {

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

}

bt_pause.setText("暂停");

bt_play.setEnabled(true);

}

/**

* 重播

* @param view

*/

public void replay(View view) {

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

mediaPlayer.seekTo(0);

}else{

play(view);

}

bt_pause.setText("暂停");

}

}

网络视频播放器,编写布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

<EditText

android:id="@+id/et_path"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:hint="请输入要播放文件的路径"/>

<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal" >

<Button

android:id="@+id/bt_play"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="play"

android:text="播放" />

<Button

android:id="@+id/bt_pause"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="pause"

android:text="暂停" />

<Button

android:id="@+id/bt_stop"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="stop"

android:text="停止" />

<Button

android:id="@+id/bt_replay"

android:layout_width="0dip"

android:layout_height="wrap_content"

android:layout_weight="1"

android:onClick="replay"

android:text="重播" />

</LinearLayout>

<SurfaceView

android:id="@+id/sv"

android:layout_width="fill_parent"

android:layout_height="fill_parent" />

</LinearLayout>

编写MainActivity

package com.itheima.musicplayer;

import java.io.File;

import java.io.IOException;

import android.app.Activity;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnCompletionListener;

import android.os.Bundle;

import android.view.SurfaceHolder;

import android.view.SurfaceHolder.Callback;

import android.view.SurfaceView;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class MainActivity extends Activity {

private EditText et_path;

private MediaPlayer mediaPlayer;

private Button bt_play,bt_pause,bt_stop,bt_replay;

private SurfaceView sv;

private SurfaceHolder holder;

private int position;

private String filepath;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

et_path = (EditText) findViewById(R.id.et_path);

bt_play = (Button) findViewById(R.id.bt_play);

bt_pause = (Button) findViewById(R.id.bt_pause);

bt_stop = (Button) findViewById(R.id.bt_stop);

bt_replay = (Button) findViewById(R.id.bt_replay);

//得到surfaceview

sv = (SurfaceView) findViewById(R.id.sv);

//得到显示界面内容的容器

holder = sv.getHolder();

//在低版本模拟器上运行记得加上下面的参数。不自己维护双缓冲区,而是等待多媒体播放框架主动的推送数据。

holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

holder.addCallback(new Callback() {

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

System.out.println("destoryed");

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

position = mediaPlayer.getCurrentPosition();

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

}

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

System.out.println("created");

if(position>0){//记录的有播放进度。

try {

mediaPlayer = new MediaPlayer();

mediaPlayer.setDataSource(filepath);//设置播放的数据源。

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mediaPlayer.setDisplay(holder);

mediaPlayer.prepare();//准备开始播放 播放的逻辑是c代码在新的线程里面执行。

mediaPlayer.start();

mediaPlayer.seekTo(position);

bt_play.setEnabled(false);

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

bt_play.setEnabled(true);

}

});

} catch (IOException e) {

e.printStackTrace();

}

}

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

System.out.println("changed");

}

});

}

/**

* 播放

* @param view

*/

public void play(View view) {

filepath = et_path.getText().toString().trim();

//File file = new File(filepath);

if(filepath.startsWith("http://")){

try {

mediaPlayer = new MediaPlayer();

mediaPlayer.setDataSource(filepath);//设置播放的数据源。

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mediaPlayer.setDisplay(holder);

mediaPlayer.prepare();//准备开始播放 播放的逻辑是c代码在新的线程里面执行。

mediaPlayer.start();

bt_play.setEnabled(false);

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

bt_play.setEnabled(true);

}

});

} catch (Exception e) {

e.printStackTrace();

Toast.makeText(this, "播放失败", 0).show();

}

}else{

Toast.makeText(this, "文件不存在,请检查文件的路径", 0).show();

}

}

/**

* 暂停

* @param view

*/

public void pause(View view) {

if("继续".equals(bt_pause.getText().toString())){

mediaPlayer.start();

bt_pause.setText("暂停");

return;

}

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

mediaPlayer.pause();

bt_pause.setText("继续");

}

}

/**

* 停止

* @param view

*/

public void stop(View view) {

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

}

bt_pause.setText("暂停");

bt_play.setEnabled(true);

}

/**

* 重播

* @param view

*/

public void replay(View view) {

if(mediaPlayer!=null&&mediaPlayer.isPlaying()){

mediaPlayer.seekTo(0);

}else{

play(view);

}

bt_pause.setText("暂停");

}

}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.itheima.musicplayer"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="19" />

<!-- 注意如果涉及到网络的都要添加上下面的一句 -->

<uses-permission android:name="android.permission.INTERNET"/>

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="com.itheima.musicplayer.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>

照相机引用,如果想使用模拟器进行拍照,需要制定模拟器的一个设置,设置如下图:

编写以下案例,当点击”拍照”之后弹出权限提示框。

1 编写布局文件activity_main.xml,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

<Button

android:onClick="click"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="拍照" />

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/iv"/>

</LinearLayout>

1 MainActivity的代码如下:

package com.itheima.camera;

import java.io.File;

import android.app.Activity;

import android.content.Intent;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.provider.MediaStore;

import android.util.Log;

import android.view.View;

import android.widget.ImageView;

/**

* 拍照的实例代码

* @author toto

*/

public class MainActivity extends Activity {

private ImageView iv;

private File file;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

iv = (ImageView) findViewById(R.id.iv);

}

/**

* 当点击之后的效果

* @param view

*/

public void click(View view) {

Intent intent = new Intent();

//指定拍照的意图ACTION_IMAGE_CAPTURE,如果是录像的可以用ACTION_VIDEO_CAPTURE,并且将文件后缀改成.3gp

intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

Log.i("FILE-PATH", Environment.getExternalStorageDirectory().toString());

//第一个参数是文件路径,第二个参数表示的是文件名称

file =  new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");

//指定保存文件的路径

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

//开启一个新的action,并且获得其返回值

startActivityForResult(intent, 100);

}

/**

* 当startActivityForResult返回结果的时候会执行下面的函数

*/

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (resultCode == 100) {

iv.setImageURI(Uri.fromFile(file));

}

super.onActivityResult(requestCode, resultCode, data);

}

}

若是手机,例如我的手机,存储在/sdcard/emulated/0中。

===============================================================================

偷拍的案例,编写如下案例(将下面的图片显示区域变得很小可以实现偷拍功能):

1 编写布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:orientation="vertical"

android:layout_height="match_parent"

tools:context=".MainActivity" >

<Button

android:onClick="click"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="拍照"/>

<FrameLayout

android:id="@+id/camera_preview"

android:layout_width="100dip"

android:layout_height="100dip"/>

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/iv"/>

</LinearLayout>

2 CameraPreview的代码如下:

package com.itheima.camera2;

import java.io.IOException;

import android.content.Context;

import android.hardware.Camera;

import android.util.Log;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

/** A basic Camera preview class */

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

private static final String TAG = "CameraPreview";

private SurfaceHolder mHolder;

private Camera mCamera;

@SuppressWarnings("deprecation")

public CameraPreview(Context context, Camera camera) {

super(context);

mCamera = camera;

// Install a SurfaceHolder.Callback so we get notified when the

// underlying surface is created and destroyed.

mHolder = getHolder();

mHolder.addCallback(this);

// deprecated setting, but required on Android versions prior to 3.0

mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

public void surfaceCreated(SurfaceHolder holder) {

// The Surface has been created, now tell the camera where to draw the preview.

try {

mCamera.setPreviewDisplay(holder);

mCamera.startPreview();

} catch (IOException e) {

Log.d(TAG, "Error setting camera preview: " + e.getMessage());

}

}

public void surfaceDestroyed(SurfaceHolder holder) {

// empty. Take care of releasing the Camera preview in your activity.

}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

// If your preview can change or rotate, take care of those events here.

// Make sure to stop the preview before resizing or reformatting it.

if (mHolder.getSurface() == null){

// preview surface does not exist

return;

}

// stop preview before making changes

try {

mCamera.stopPreview();

} catch (Exception e){

// ignore: tried to stop a non-existent preview

}

// set preview size and make any resize, rotate or

// reformatting changes here

// start preview with new settings

try {

mCamera.setPreviewDisplay(mHolder);

mCamera.startPreview();

} catch (Exception e){

Log.d(TAG, "Error starting camera preview: " + e.getMessage());

}

}

}

  1. MainActivity的代码如下:

package com.itheima.camera2;

import java.io.File;

import java.io.FileOutputStream;

import android.app.Activity;

import android.hardware.Camera;

import android.hardware.Camera.AutoFocusCallback;

import android.hardware.Camera.PictureCallback;

import android.os.Bundle;

import android.os.SystemClock;

import android.view.View;

import android.widget.FrameLayout;

import android.widget.ImageView;

import android.widget.Toast;

public class MainActivity extends Activity {

private ImageView iv;

private Camera mCamera;

private CameraPreview mPreview;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

iv = (ImageView) findViewById(R.id.iv);

// Create an instance of Camera

mCamera = getCameraInstance();

// Create our Preview view and set it as the content of our activity.

mPreview = new CameraPreview(this, mCamera);

FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);

preview.addView(mPreview);

}

public void click(View view){

mCamera.autoFocus(new AutoFocusCallback() {

@Override

public void onAutoFocus(boolean success, Camera camera) {

mCamera.takePicture(null, null, new PictureCallback() {

@Override

public void onPictureTaken(byte[] data, Camera camera) {

try {

//File file = new File(Environment.getExternalStorageDirectory(),SystemClock.uptimeMillis()+".jpg");

File file = new File("/mnt/sdcard2",SystemClock.uptimeMillis()+".jpg");

FileOutputStream fos = new FileOutputStream(file);

fos.write(data);

fos.close();

Toast.makeText(getApplicationContext(), "成功", 0).show();

mCamera.startPreview();

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

});

}

/** 获取一个照相机实例 */

public static Camera getCameraInstance(){

Camera c = null;

try {

c = Camera.open(); // attempt to get a Camera instance

}

catch (Exception e){

// Camera is not available (in use or does not exist)

}

return c; // returns null if camera is unavailable

}

@Override

protected void onDestroy() {

mCamera.stopPreview();

mCamera.release();

mCamera = null;

super.onDestroy();

}

}

  1. 编写AndroidManifest.xml的清单文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.itheima.camera2"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="19" />

<uses-permission android:name="android.permission.CAMERA" />

<uses-feature android:name="android.hardware.camera" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="com.itheima.camera2.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>



22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现的更多相关文章

  1. iOS开发系列--音频播放(音效和音乐)播放本地的

    音频 在iOS中音频播放从形式上可以分为音效播放和音乐播放.前者主要指的是一些短音频播放,通常作为 点缀音频,对于这类音频不需要进行进度.循环等控制.后者指的是一些较长的音频,通常是主音频,对于这些音 ...

  2. iOS之基于FreeStreamer的简单音乐播放器(模仿QQ音乐)

    代码地址如下:http://www.demodashi.com/demo/11944.html 天道酬勤 前言 作为一名iOS开发者,每当使用APP的时候,总难免会情不自禁的去想想,这个怎么做的?该怎 ...

  3. iOS音频播放之AudioQueue(一):播放本地音乐

    AudioQueue简单介绍 AudioStreamer说明 AudioQueue具体解释 AudioQueue工作原理 AudioQueue主要接口 AudioQueueNewOutput Audi ...

  4. Ubuntu 14.04 用户如何安装深度音乐播放器和百度音乐插件

    播放本地音乐或者收听国外的音乐电台,Ubuntu 14.04 自带的音乐播放器 Rhythmbox 完全能够满足,但是如果你想有像酷狗那样的国内播放器就需要折腾一下,还好有深度音乐播放器,这是一款完全 ...

  5. 我在 Gitee 上发现了一个简洁又好用的网络音乐播放器!

    这几天无聊的时候我想听听歌,但我想要找一个简单快速的网络音乐播放器来用用.这时我在 Gitee 上看见一个看上去不错的开源项目 -- Hi音乐. 项目链接:https://gitee.com/hi-j ...

  6. 使用react native制作的一款网络音乐播放器

    使用react native制作的一款网络音乐播放器 基于第三方库 react-native-video设计"react-native-video": "^1.0.0&q ...

  7. 微信中音乐播放在ios不能自动播放解决

    在微信中,ios手机下面音乐被自动禁掉无法自动播放,我们可以执行触发body上的元素,自动进行播放. //音乐 var x = document.getElementById("myAudi ...

  8. html 音乐 QQ播放器 外链 代码 播放器 外链 代码

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha QQ播放器 外链 代码 播放器 外链 代码 ======== 歌曲链接 QQ播放器 外链 ...

  9. swift3.0 简单直播和简单网络音乐播放器

    本项目采用swift3.0所写,适配iOS9.0+,所有界面均采用代码布局. 第一个tab写的是简单直播,传统MVC模式,第二个tab写的是简单网络音乐播放器.传说MVVM模式(至于血统是否纯正我就不 ...

随机推荐

  1. gdb不知为何显示2次析构

    gdb不知为何显示2次析构 (金庆的专栏 2016.11) gdb 显示2次 A::~A(): (gdb) bt #0 A::~A (this=0x602010, __in_chrg=<opti ...

  2. 安卓高级8 SurfaceView案例三 结合mediaplay播放视频

    我们知道mediaplay无法直接播放视频所以我们结合Surface package qianfeng.com.mediaplayerdemo; import android.media.MediaP ...

  3. Eclipse的Debug调试技巧

    作为开发人员,掌握开发环境下的调试技巧十分有必要.我们在编写java程序的过程中,经常会遇到各种莫名其妙的问题,为了检测程序是哪里出现问题,经常需要增加日志,看变量的值,这样调试很麻烦.假设我每天花费 ...

  4. Intellij IDEA 插件开发之自建插件仓库

    Intellij IDEA 有一个自己的官方的插件仓库,但是当我们的开发的 Intellij IDEA 的插件不能够对外公开时,我们就需要搭建自己的 Intellij IDEA 的插件仓库.前不久我们 ...

  5. SQL Server性能优化——等待——SLEEP_BPROOL_FLUSH

    前言: 有一个用于历史归档的数据库(简称历史库),经过一定时间的积累,数据文件已经达到700多GB,后来决定某些数据可以不需要保留,就把这部分数据truncate了,空余出600多GB的空间,也就是说 ...

  6. ScheduledExecutorService和timer的异同

    先来个传统的Timer的例子: package com.jerry.concurrency; import java.text.ParseException; import java.text.Sim ...

  7. XML Schema

    XML Schema 是基于 XML 的 DTD 替代者. XML Schema 描述 XML 文档的结构. XML Schema 语言也称作 XMLSchema 定义(XML Schema Defi ...

  8. Dynamics CRM 将实体从高级查找列表中移除不可见

    有时我们不需要将某个实体显示给一般用户比如配置实体,但是这种类型的实体有时候又需要给一般用户读权限ODATA的时候得能读,站点地图上的隐藏比较容易用工具配置下权限即可.其实做到这步一般就可以了但有的客 ...

  9. 对 jiffies 溢出、回绕及 time_after 宏的理解

    原文如下: 关于jiffies变量:     全局变量jiffies用来记录自启动以来产生的节拍的总数.系统启动时会将该变量初始化为0,此后,每当时钟中断产生时就会增加该变量的值.jiffies和另外 ...

  10. Dynamics CRM 2015Online Update1 new feature之 通过业务规则清空字段的值

    自2013引入业务规则后很多的功能就不需要通过javascript来实现,业务人员直接通过配置就能解决.那随着版本的更新业务规则的功能也越来越强大,从之前很单纯的逻辑到后面的if..else,相信后面 ...