22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现
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(); } } |
==============================================================================
视频播放器,实现”播放”、“暂停”、”停止”、“重播”。案例截图如下:
播放布局文件
<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> |
编写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. 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. 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. } 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()); } } } |
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(); } } |
编写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中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现相关推荐
- 本地服务器的音乐如何才能播放视频文件夹,mx播放器如何添加本地文件 添加本地文件设置方法...
更换播放器皮肤/主题颜色 在这个版本中 主题颜色的设置十分丰富 不再拘泥于原来的黑白二色 点击"设置"选择"列表"项 修改主题,选择一种自己喜欢的颜色 现在有十 ...
- Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51290181 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现NetM ...
- Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索
转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51298411 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现网络音乐 ...
- Android开发本地及网络Mp3音乐播放器(十五)网络音乐及歌词下载功能实现
实现功能: 实现网络音乐歌词下载功能(下载音乐的同时,下载对应歌词) 下载好的歌词目前不在播放器内,可以通过文件浏览器查看. 后续将博文,将实现本地音乐歌词下载和已下载音乐扫描功能. 因为,没有自己的 ...
- Android开发本地及网络Mp3音乐播放器(十四)网络音乐下载功能实现
实现功能: 实现网络音乐搜索功能 实现网络音乐下载功能 下载好的音乐目前不在播放器内,可以通过文件浏览器查看. 后续将博文,将实现歌词和下载音乐扫描功能. 经过将近4天,才发布这一篇博客,明显更新博客 ...
- iOS之基于FreeStreamer的简单音乐播放器(模仿QQ音乐)
代码地址如下: http://www.demodashi.com/demo/11944.html 天道酬勤 前言 作为一名iOS开发者,每当使用APP的时候,总难免会情不自禁的去想想,这个怎么做的?该 ...
- android网络音乐播放器
** 网络音乐播放器 ** 转载请指明博客网址 作者:WangYouHu我的主页网址 链接:https://www.jianshu.com/p/855659f266ae 著作权归作者所有,任何形式的转 ...
- iOS音频播放之AudioQueue(一):播放本地音乐
AudioQueue简介 AudioStreamer说明 AudioQueue详解 AudioQueue工作原理 AudioQueue主要接口 AudioQueueNewOutput AudioQue ...
- 简单几步实现网络音乐播放器(Python爬虫版百度FM)
Python入门之爬取百度音乐 先说一下为什么会有这篇文章,首先肯定是有这个需求了,本人出差在外地,这里的网速卡到爆,根本支撑不了在线听歌的要求,所以就想下载到本地来慢慢听.这可是python的绝活, ...
最新文章
- vrep小车避障算法_V-REP 小车建模
- mysql-索引-笔记
- CentOs安装ssh服务
- Redis使用场景一,查询出的数据保存到Redis中,下次查询的时候直接从Redis中拿到数据。不用和数据库进行交互。...
- Android系统(转)
- 《C++之那些年踩过的坑(附录一)》
- hashmap头插法和尾插法区别_Java程序员必知:HashMap进行put操作会不会引起死循
- CSDN资源上传记录(持续更新)
- 程序员专用壁纸!!!
- java reader类 实例_java字符流-java writer-java reader-嗨客网
- MATLAB雷达信号处理
- SLAM 学习笔记 本质矩阵E、基础矩阵F、单应矩阵H的推导
- astropy.io.fits 教程
- EtherCAT从站协议栈代码笔记之ecat_def.h
- 谷歌刷新纪录:将圆周率精确到了小数点后31万亿位,光存储就占了几个大硬盘!
- docker使用和搭建
- c# 屏幕取词的方法
- CSS多行文本溢出隐藏,显示省略号
- Selenium 设置带账号密码的socks5代理
- CBA联赛32轮 山西男篮92:86战胜江苏同曦
热门文章
- 算法与数据结构(python):线性查找与二分查找
- mysql数据库入门教程(6):数据的增删改
- VTK:隐式数据集剪辑用法实战
- OpenCASCADE:Modeling Algorithms模块几何工具之来自约束的线和圆
- wxWidgets:wxWindowUpdateLocker类用法
- boost::type_erasure::dereferenceable相关的测试程序
- 一个简单的 Hello world! 例子使用 boost::mpi::group 和 boost::mpi::broadcast()
- boost::geometry::radius_type用法的测试程序
- GDCM:gdcm::PrivateTag的测试程序
- Boost:字符串转换实例