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. 安卓 LayoutInflater参数作用

    方法重载1 public View inflate (int resource, ViewGroup root, boolean attachToRoot) 方法重载2 public View inf ...

  2. Hibernate设置时间戳的默认值和更新时间的自动更新

    Generated and default property values 生成的和默认的属性值 The database sometimes generates a property value, ...

  3. java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener问题解决

    今天搭建SSH项目的时候出现了如下错误: 严重: Error configuring application listener of class org.springframework.web.con ...

  4. Linux内核中的有关Page的算法

    static inline int get_order(unsigned long size) { int order; size = (size-1) >> (PAGE_SHIFT-1) ...

  5. 优化Javascript数据遍历

    问题 M是一个对象的集合,没个对象拥有唯一的字符串类型的Id N是Id的集合. 从M中过滤掉Id不在N中的对象. 假如M有50w个数据,N中可能是0~50w任意的数据. 方案1 使用数组保存Id的集合 ...

  6. Linux 高性能服务器编程——socket选项

    socket选项函数 功能:用来读取和设置socket文件描述符属性的方法 函数: #include <sys/scoket.h> int getsockopt ( int sockfd, ...

  7. android 图片网络下载github开源框架之Universal-Image-Loader

    最近在做妙趣剪纸项目,剪纸应用项目链接.发扬传统文化,大家多多关注. 需要自己搭建服务器,我用的是新浪sae,简直秒杀京东云几条街,把图片放在网上下载,但是图片经常下载要遇到很多问题,包括oom等.所 ...

  8. 验证码程序Demo

    小伙伴都有这样的经历,册各种网站,总是输不对验证码,双十一那天狂买的小伙伴是不是对输入验证码有着不一样的感触呢,以前觉得验证码真是个麻烦鬼,一个不小心,一个眼拙,哎呦,没有输入正确,又是一阵子大眼瞪小 ...

  9. javascript之事件模型

    事件模型 冒泡型事件(Bubbling):事件由叶子节点沿祖先节点一直向上传递到根节点 捕获型事件(Capturing):由DOM树最顶元素一直到最精确的元素,与冒泡型事件相反 DOM标准事件模型:D ...

  10. UNIX网络编程——常用服务器模型总结

    下面有9种服务器模型分别是: 迭代服务器. 并发服务器,为每个客户fork一个进程. 预先派生子进程,每个子进程都调用accept,accept无上锁保护. 预先派生子进程,以文件锁的方式保护acce ...