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

启动调试,看看效果:


这样就成功了。

三、尾言

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

相关推荐
雨白42 分钟前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk44 分钟前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING1 小时前
RN容器启动优化实践
android·react native
恋猫de小郭4 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
YF02117 小时前
AndroidStudio工具链配置
android studio
Kapaseker9 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴9 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭19 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab20 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack