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

简介: 1 编写以下案例: 当点击了”播放”之后,在手机上的/mnt/sdcard2/natural.mp3就会播放。2 编写布局文件activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/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();

       }

    }

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

  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>

 


目录
相关文章
|
1月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
3月前
|
监控 Android开发 C语言
深度解读Android崩溃日志案例分析2:tombstone日志
深度解读Android崩溃日志案例分析2:tombstone日志
84 0
|
3月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
38 0
|
3月前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
22 0
|
4月前
|
XML Java Android开发
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
139 0
|
4月前
|
XML Java Android开发
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
Android Studio App开发之服务Service的讲解及实战(包括启动和停止,绑定与解绑,推送服务到前台实现音乐播放器,附源码)
108 0
|
9天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
9 0
|
9天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
9 0
|
4月前
|
XML JSON Java
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
164 0
|
2月前
|
存储 数据库 Android开发

热门文章

最新文章