• Android学习(八)


    调用摄像头拍照。

    1. 新建一个CameraAlbumTest项目, 然后修改activity_main中的代码 添加一个按钮 和一个ImageView控件。

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

      <Button
          android:id="@+id/btn_take_photo"
          android:text="调用相机拍照"
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />
      <ImageView
          android:id="@+id/iv_photo"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
      

    2. 修改MainActivity中的代码。

      public class MainActivity extends AppCompatActivity {
      public static final int TAKE_PHOTO = 1 ; //代表拍照 requestCode
      private ImageView ivPhoto;
      private Button btnTakePhoto;

      private Uri imgUri;     // 图片的Uri
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          intiView();
      
          btnTakePhoto.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  File image = new File(getExternalCacheDir(),"photo.jpg");
                  try {
                      if(image.exists()){//如果这个文件存在就把这个文件删除。
                          image.delete();
                      }
                      image.createNewFile();//. 创建这个文件。
                  }catch (IOException e) {
                      e.printStackTrace();
                  }
                  // cn.zbuter.cameraalbumtest.provider 要与AndroidManifest中的provider中对应
                  imgUri = FileProvider.getUriForFile(MainActivity.this,"cn.zbuter.cameraalbumtest.provider",image);
                  Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                  intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); //需要加在这一行 来指定图片的输出地址
                  startActivityForResult(intent,TAKE_PHOTO);
              }
          });
      }
      
      @Override
      protected void onActivityResult(int requestCode, int resultCode,Intent data) {
          //super.onActivityResult(requestCode, resultCode, data);
      
          switch (requestCode){
              case TAKE_PHOTO:
                  if(resultCode == RESULT_OK){
                      Bitmap bitmap= null;
                      try {
                          bitmap = BitmapFactory.decodeStream
                                  (getContentResolver().openInputStream(imgUri));
                          ivPhoto.setImageBitmap(bitmap);
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
           //         Bundle bundle=data.getExtras();
         //           Bitmap bitmap= (Bitmap) bundle.get("data");   //这种方式得到的图片是经过压缩的 特别小。
                  }
                  break;
              default:
                      break;
          }
      }
      
      public void intiView(){
          ivPhoto = (ImageView) findViewById(R.id.iv_photo);
          btnTakePhoto = (Button) findViewById(R.id.btn_take_photo);
      }
      

      }

    3. 在res目录下新建一个xml文件夹,然后在这个文件夹下新建一个文件名为file_paths.xml 编辑这个资源文件如下:

      <?xml version="1.0" encoding="utf-8"?>
      <paths xmlns:android = "http://schemas.android.com/apk/res/android">
          <external-path
              name="photos"
              path="" />
      </paths>
      

      external-path就是用来指定Uri共享的,那么属性值可以随便填写,path属性的值表示共享的具体路径, 这里设置为空就表示将整个SD卡进行共享。

    4. 在AndroidManifest文件中的application标签中注册内容提供器。

      <provider
          android:authorities="cn.zbuter.cameraalbumtest.provider"
          android:name="android.support.v4.content.FileProvider"
          android:exported="false"
          android:grantUriPermissions="true">
          <meta-data 
              android:name="android.support.FILE_PROVIDER_PATHS"
              android:resource="@xml/file_paths"/>
      </provider>
      
    5. 如果需要适配Android4.4以前的系统需要在manifest中声明应用冠梁目录的权限。

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

    从相册中选择图片。

    1. 修改MainActivity中的代码加入从相册中选择图片的逻辑 代码如下。

      public class MainActivity extends AppCompatActivity {
          public static final int TAKE_PHOTO = 1 ; //代表拍照 requestCode
          public static final int CHOOSE_PHOTO = 2; //代表选择图片 requestCode
      
          private ImageView ivPhoto;
          private Button btnTakePhoto;
          private Button btnChoosePhoto;
      
          private Uri imgUri;     // 图片的Uri
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              intiView();
      
              btnTakePhoto.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      File image = new File(getExternalCacheDir(),"photo.jpg");
                      try {
                          if(image.exists()){//如果这个文件存在就把这个文件删除。
                              image.delete();
                          }
                          image.createNewFile();//. 创建这个文件。
                      }catch (IOException e) {
                          e.printStackTrace();
                      }
                      // cn.zbuter.cameraalbumtest.provider 要与AndroidManifest中的provider中对应
                      imgUri = FileProvider.getUriForFile(MainActivity.this,"cn.zbuter.cameraalbumtest.provider",image);
                      Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                      intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); //需要加在这一行 来指定图片的输出地址
                      startActivityForResult(intent,TAKE_PHOTO);
                  }
              });
              btnChoosePhoto.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      //判断权限
                      if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) 
                              != PackageManager.PERMISSION_GRANTED){
                          //申请授权
                          ActivityCompat.requestPermissions(MainActivity.this,new 
                                  String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
                      }else{
                          openAlbum();
                      }
                  }
              });
          }
          public void openAlbum(){
              Intent intent = new Intent("android.intent.action.GET_CONTENT");
              intent.setType("image/*");
              startActivityForResult(intent,CHOOSE_PHOTO);
          }
      
      
          @Override
          public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
              switch (requestCode){
                  case 1:
                      if(grantResults.length > 0&&grantResults[0] == PackageManager.PERMISSION_GRANTED){
                          openAlbum();
                      }else{
                          Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
                      }
                      break;
                  default:
                      break;
              }
          }
      
          @Override
          protected void onActivityResult(int requestCode, int resultCode,Intent data) {
              switch (requestCode) {
                  case TAKE_PHOTO:
                      if (resultCode == RESULT_OK) {
                          Bitmap bitmap = null;
                          try {
                              bitmap = BitmapFactory.decodeStream
                                      (getContentResolver().openInputStream(imgUri));
                              ivPhoto.setImageBitmap(bitmap);
                          } catch (Exception e) {
                              e.printStackTrace();
                          }
                  //     Bundle bundle=data.getExtras();
                  //       Bitmap bitmap= (Bitmap) bundle.get("data");   //这种方式得到的图片是经过压缩的 特别小。
                      }
                      break;
                  case CHOOSE_PHOTO:
                      if (resultCode == RESULT_OK) {
                          if(Build.VERSION.SDK_INT >=19){// Android 4.4以上版本
                              handleImageOnKitKat(data);
                          }else{
                              handleImageforeKitKat(data);
                          }
                      }
                      break;
                  default:
                          break;
              }
          }
          private void handleImageforeKitKat(Intent data){
              Uri uri = data.getData();
              String imagePath = getImagePath(uri,null);
              displayImage(imagePath);
          }
          private void handleImageOnKitKat(Intent data){
              String imagePath = null;
              Uri uri = data.getData();
              if(DocumentsContract.isDocumentUri(this,uri)){
                  //如果是document类型的uri就通过document id 处理
                  String docID = DocumentsContract.getDocumentId(uri);
                  if("com.android.providers.media.documents".equals(uri.getAuthority())){
                      String id = docID.split(":")[1]; //解析出来的数字格式的id
                      String selection = MediaStore.Images.Media._ID + "=" + id; //拼接  id = 123 格式
                      Log.i("BBBBBBBBBBBBBBBBBBBBBB", "selection: "+selection);
                      imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);
                      Log.i("BBBBBBBBBBBBBBBBBBBBBB", "imagePath: "+imagePath);
                  }else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){
                      Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docID));
                      imagePath = getImagePath(contentUri,null);
                  }
              }else if ("content".equalsIgnoreCase(uri.getScheme())){ // 如果是content类型的uri
                  imagePath = getImagePath(uri,null);
              }else if("file".equalsIgnoreCase(uri.getScheme())){//如果是File类型的uri直接获取图片的路径即可。
                  imagePath = uri.getPath();
              }
              displayImage(imagePath);
          }
          private void displayImage(String imagePath){
              if(imagePath != null){
                  Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
                  ivPhoto.setImageBitmap(bitmap);
              }else{
                  Toast.makeText(this, "图片加载错误", Toast.LENGTH_SHORT).show();
              }
          }
          public String getImagePath(Uri uri, String selection){
              String path = null;
              //通过Uri和selection来获取真实的图片路径
              Cursor cursor = getContentResolver().query(uri,null,selection,null,null);
              if(cursor != null){
                  if(cursor.moveToNext()){
                      path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                  }
              }
              cursor.close();
              return path;
          }
          public void intiView(){
              ivPhoto = (ImageView) findViewById(R.id.iv_photo);
              btnTakePhoto = (Button) findViewById(R.id.btn_take_photo);
              btnChoosePhoto = (Button) findViewById(R.id.btn_choose_photo);
          }
      }
      

      由于在Android4.4版本开始选取相册中的图片不返回图片的真实Uri了,而是一个封装过的Uri.

    播放多媒体文件,

    在Android中播放音频文件一般都是使用mediaplayer类来实现的, 他对多种格式的音频文件提供了非常去那面的控制方法。,从而是的播放音乐的工作变为十分简单,下表列出了MediaPlayer类中的一些较为常用的方法

    方法名                    功能描述
    
    setDataSource()        设置要播放的音频文件的位置。
    prepare()            在开始播放之前调用这个方法完成准备工作。
    start()                开始或继续播放音频。
    pause()                暂停播放音频。
    reset()                将 MediaPlayer 对象重置到刚刚创建的状态。
    seekTo()            从指定的位置开始播放音频。
    stop()                停止播放音频。调用这个方法后的 MediaPlayer 对象无法再播放音频。
    release()            释放掉与 MediaPlayer 对象相关的资源。
    isPlaying()            判断当前 MediaPlayer 是否正在播放音频。
    getDuration()        获取载入的音频文件的时长。
    

    MediaPlayer 首先要创建出以个MediaPlayer对象, 然后调用setDataSource()方法来设置音频文件的路径,在调用prepare()方法使MediaPlayer进入到准备状态,接下来调用start()方法就可以开始播放音频,调用pause()方法就会暂停,调用reset()方法就会停止播放。

    1. 创建一个PlayAudioTest项目, 修改activity_main中的代码添加三个按钮分别是开始暂停和重置。

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">
      
          <Button
              android:id="@+id/btn_start"
              android:text="开始"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" />
          <Button
              android:id="@+id/btn_pause"
              android:text="暂停"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" />
          <Button
              android:id="@+id/btn_reset"
              android:text="重置"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" />
      
      </LinearLayout>
      
    2. 修改MainActivity中的代码如下:

      public class MainActivity extends AppCompatActivity {
          private MediaPlayer player = new MediaPlayer();
          private Button btnStart;
          private Button btnPause;
          private Button btnReset;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      initView();
      
      if(ContextCompat.checkSelfPermission(MainActivity.this,
              Manifest.permission.WRITE_EXTERNAL_STORAGE)
              != PackageManager.PERMISSION_GRANTED){
          ActivityCompat.requestPermissions(this,
                  new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
      }else{
          initMediaPlayer();
      }
      
      
      btnStart.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              //播放按钮点击
              if(!player.isPlaying()){
                  player.start();
              }
          }
      });
      
      
      btnPause.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              //暂停按钮点击
              if(player.isPlaying()) {
                  player.pause();
              }
          }
      });
      
      btnReset.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              //重置按钮点击
              if(player.isPlaying()) {
                  player.reset();
                  initMediaPlayer();
              }
          }
      });
      

      }

          private void initMediaPlayer(){
              try{
                  File file = new File(Environment.getExternalStorageDirectory(),"music.mp3");
                  Log.i("BBBBBBBBBBBBBB", "Environment.getExternalStorageDirectory(): "+Environment.getExternalStorageDirectory());
                  player.setDataSource(file.getPath());
                  player.prepare();
              }catch(Exception e){
                  e.printStackTrace();
              }
          }
      
          @Override
          public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
              switch(requestCode){
                  case 1:
                      if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                          initMediaPlayer();
                      }else{
                          Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
                          finish();
                      }
              }
          }
      
          public void initView(){
              btnStart = (Button) findViewById(R.id.btn_start);
              btnPause = (Button) findViewById(R.id.btn_pause);
              btnReset = (Button) findViewById(R.id.btn_reset);
          }
      }
      
    3. 声明权限 在 AndroidMifest

    1. 向模拟器的 /storage/emulated/0 目录中 存放music.mp3 文件。

    播放视频文件。

    播放视频文件其实并不比播放音频文件更加复杂。主要是由于使用一个VideoView来实现的,这个类将视频的显示和控制基于一身, 使我们借助他就可以完成一个简易的视频播放器, VideoView的用法和MediaPlayer也较为类似。主要由以下常用方法。

    setVideoPath:设置要播放的视频文件的位置
    start:开始或继续播放视频
    pause:暂停播放视频
    resume:将视频从头开始播放
    seekTo:从指定的位置开始播放视频
    isPlaying:判断当前是否正在播放视频
    getDuration:获取载入的视频文件的时长
    
    1. 创建一个PlayVideoTest项目

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          >
          <VideoView
              android:id="@+id/video_view"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" />
          <LinearLayout
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
              <Button
                  android:id="@+id/btn_start"
                  android:text="播放"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  />
              <Button
                  android:id="@+id/btn_pause"
                  android:text="暂停"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  />
              <Button
                  android:id="@+id/btn_replay"
                  android:text="重播"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  />
          </LinearLayout>
      
      </LinearLayout>    
      
    2. MainActivity

      public class MainActivity extends AppCompatActivity {
          private VideoView videoView;
          private Button btnStart;
          private Button btnPause;
          private Button btnRepaly;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              initView();
      
              btnStart.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      //点击播放
                      if(!videoView.isPlaying()){
                          videoView.start();
                      }
                  }
              });
              btnPause.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      //点击暂停
                      if(videoView.isPlaying()){
                          videoView.pause();
                      }
                  }
              });
              btnRepaly.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      //点击重播
                      if(videoView.isPlaying()){
                          videoView.resume();
                      }
                  }
              });
      
              if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
                      != PackageManager.PERMISSION_GRANTED){
                  ActivityCompat.requestPermissions(this,
                          new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE} , 1);
              }else{
                  initVideo();
              }
          }
      
          public void initVideo(){
              File file = new File(Environment.getExternalStorageDirectory(),
                      "video.mp4");
              videoView.setVideoPath(file.getPath());
          }
      
          @Override
          public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
              switch(requestCode){
                  case 1:
                      if(grantResults.length > 0 && grantResults[1] == PackageManager.PERMISSION_GRANTED){
                          initVideo();
                      }else{
                          Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
                          finish();
                      }
                      break;
              }
          }
      
          public void initView(){
              btnPause = (Button)findViewById(R.id.btn_pause);
              btnStart = (Button) findViewById(R.id.btn_start);
              btnRepaly = (Button) findViewById(R.id.btn_replay);
              videoView = (VideoView) findViewById(R.id.video_view);
          }
      }
      
    3. 声明权限

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




  • 相关阅读:
    Python-读取文件内容
    torch_03_二分类
    torch_02_多项式回归
    pytorch_01_基础_一维线性回归
    LC-KSVD 代码解读
    标签一致项(LC-KSVD)-全文解读
    PCA:主成分分析
    牛客刷题-大佬链接
    调试MATLAB代码
    scroll offset & client总结
  • 原文地址:https://www.cnblogs.com/zbuter/p/10020983.html
Copyright © 2020-2023  润新知