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

发布于:2025-04-08 ⋅ 阅读:(32) ⋅ 点赞:(0)

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

一、真机的使用

首先,用USB线将你的手机与电脑连接起来,打开手机的开发者模式(连续点击版本信息),之后进入开发者模式中将USB调试打开,Android studio就会自动连上你的手机。
请添加图片描述
这样我们就可以通过真机来进行模拟,但是要注意一点,真机的调试发生错误后不会在控制台输出错误,如果要进一步发现错误,还是要在模拟器中进行调试:
请添加图片描述

二、多媒体的初次接触

接下来,我们将通过代码,完成调用拍照的功能
DateUitl(记录当前时间):

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:用来进行像素的转换和屏幕的适配:

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:

<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:

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);
    }
}

启动调试,看看效果:
请添加图片描述
请添加图片描述
请添加图片描述
这样就成功了。

三、尾言

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


网站公告

今日签到

点亮在社区的每一天
去签到