Android studio学习之路(六)--真机的调试以及多媒体照相的使用

多媒体应用(语言识别,照相,拍视频)在生活的各个方面都具有非常大的作用,所以接下来将会逐步介绍多媒体的使用,但是在使用多媒体之前,使用模拟器肯定是不行的,所以我们必须要使用真机去进行调试。

一、真机的使用

首先,用USB线将你的手机与电脑连接起来,打开手机的开发者模式(连续点击版本信息),之后进入开发者模式中将USB调试打开,Android studio就会自动连上你的手机。

这样我们就可以通过真机来进行模拟,但是要注意一点,真机的调试发生错误后不会在控制台输出错误,如果要进一步发现错误,还是要在模拟器中进行调试:

二、多媒体的初次接触

接下来,我们将通过代码,完成调用拍照的功能

DateUitl(记录当前时间):

java 复制代码
package com.example.gdmap;

import android.annotation.SuppressLint;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

@SuppressLint("SimpleDateFormat")

public class DateUitl {
    //获取当前日期时间
    public static String getNowDateTime(){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
        return sdf.format(new Date());
    }

    //获取当前时间
    public static String getNowDime(){
        SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
        return sdf.format(new Date());
    }

    //获取当前的时间(精确到毫秒)
    public static String getNowTimeDetail(){
        SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss.SSS");
        return sdf.format(new Date());
    }
    //把日历格式转化为字符串
    public static String getDate(Calendar calendar){
        Date date =calendar.getTime();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(date);
    }



}

uitl:用来进行像素的转换和屏幕的适配:

java 复制代码
package com.example.gdmap;

import android.content.Context;

public class util {
    //根据手机的分辨率从dp的单位转成px(像素)
    public static int dip2px(Context context,float dpValue){
        //获取当前手机的像素密度(1个dp对应几个px)
        float scale=context.getResources().getDisplayMetrics().density;
        return (int)(dpValue*scale+0.5f);//四舍五入取整
    }

    //根据手机的分辨率从px(像素)的单位转成dp
    public static int px2dip(Context context,float pxValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    //获取屏幕宽度
    public static int getScreenWidth(Context ctx){
        return ctx.getResources().getDisplayMetrics().widthPixels;
    }

    //获取屏幕高度

    public static int getScreenHeight(Context ctx){
        return ctx.getResources().getDisplayMetrics().heightPixels;
    }


}

接下来,创建Phototake活动,调用拍照功能并将照片储存在当前页面:

xml:

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_thumbnail"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="打开相机(缩略图)"
            android:textColor="@color/black"
            android:textSize="17sp" />

        <Button
            android:id="@+id/btn_original"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="打开相机(原始照片)"
            android:textColor="@color/black"
            android:textSize="17sp" />

    </LinearLayout>

    <ImageView
        android:id="@+id/iv_photo"
        android:layout_width="match_parent"
        android:layout_height="360dp"
        android:scaleType="fitCenter" />

</LinearLayout>

java:

java 复制代码
package com.example.gdmap;

import android.content.ContentValues;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.ImageView;

import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.gdmap.BitmapUitl;
import com.example.gdmap.DateUitl;

public class Phototake extends AppCompatActivity {

    private final static String TAG = "PhotoTakeActivity";
    private ImageView iv_photo; // 声明一个图像视图对象
    private Uri mImageUri; // 图片的路径对象
    private ActivityResultLauncher launcherThumbnail; // 声明一个活动结果启动器对象
    private ActivityResultLauncher launcherOriginal; // 声明一个活动结果启动器对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phototake);
        iv_photo = findViewById(R.id.iv_photo);
        // 注册一个善后工作的活动结果启动器,准备打开拍照界面(返回缩略图)
        launcherThumbnail = registerForActivityResult(
                new ActivityResultContracts.TakePicturePreview(), bitmap -> iv_photo.setImageBitmap(bitmap));
        findViewById(R.id.btn_thumbnail).setOnClickListener(v -> launcherThumbnail.launch(null));
        // 注册一个善后工作的活动结果启动器,准备打开拍照界面(返回原始图)
        launcherOriginal = registerForActivityResult(
                new ActivityResultContracts.TakePicture(), result -> {
                    if (result) {
                        Bitmap bitmap = BitmapUitl.getAutoZoomImage(this, mImageUri);
                        iv_photo.setImageBitmap(bitmap); // 设置图像视图的位图对象
                    }
                });
        findViewById(R.id.btn_original).setOnClickListener(v -> takeOriginalPhoto());
    }

    // 拍照时获取原始图片
    private void takeOriginalPhoto() {
        // Android10开始必须由系统自动分配路径,同时该方式也能自动刷新相册
        ContentValues values = new ContentValues();
        // 指定图片文件的名称
        values.put(MediaStore.Images.Media.DISPLAY_NAME, "photo_"+DateUitl.getNowDateTime());
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); // 类型为图像
        // 通过内容解析器插入一条外部内容的路径信息
        mImageUri = getContentResolver().insert(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        launcherOriginal.launch(mImageUri);
    }
}

启动调试,看看效果:


这样就成功了。

三、尾言

目前作者比较忙,可能更新速度会有所下降,但是会一直更下去的。

相关推荐
lalapanda21 分钟前
UE学习记录part16
学习
@PHARAOH22 分钟前
WHAT - React 进一步学习推荐
前端·学习·react.js
kovlistudio24 分钟前
红宝书第四十讲:React 核心概念:组件化 & 虚拟 DOM 简单教程
开发语言·前端·javascript·学习·react.js·前端框架
螺旋小蜗25 分钟前
Maven工具学习使用(十二)——extension和depency的区别
学习·extension·depency
却道天凉_好个秋26 分钟前
音视频学习(三十四):H264中的宏块
学习·音视频·宏块
却道天凉_好个秋31 分钟前
音视频学习(三十三):GOP详解
学习·音视频·gop
键盘敲没电1 小时前
【iOS】UIPageViewController学习
学习·ios·cocoa
___波子 Pro Max.1 小时前
Android envsetup与Python venv使用指南
android·python
武帝为此1 小时前
【MySQL 删除数据详解】
android·数据库·mysql
顾林海1 小时前
深度解析HashMap工作原理
android·java·面试