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

启动调试,看看效果:


这样就成功了。

三、尾言

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

相关推荐
雨白40 分钟前
玩转 Flow 操作符(二):时间控制、聚合与组合
android·kotlin
Jerry41 分钟前
Compose 基础知识章节合集
android
Jerry1 小时前
Compose 布局、主题设置和动画测试
android
FserSuN1 小时前
Mem0:构建具有可扩展长期记忆的生产级AI代理 - 论文学习总结1
人工智能·学习
im_AMBER1 小时前
Leetcode 41
笔记·学习·算法·leetcode
Zender Han1 小时前
Flutter 状态管理详解:深入理解与使用 Bloc
android·flutter·ios
程序员江同学1 小时前
Kotlin 技术月报 | 2025 年 10 月
android·kotlin
im_AMBER2 小时前
React 05
开发语言·前端·javascript·笔记·学习·react.js·前端框架
RickyWasYoung3 小时前
【matlab】字符串数组 转 double
android·java·javascript
南方的狮子先生3 小时前
【数据结构】(C++数据结构)查找算法与排序算法详解
数据结构·c++·学习·算法·排序算法·1024程序员节