多媒体应用(语言识别,照相,拍视频)在生活的各个方面都具有非常大的作用,所以接下来将会逐步介绍多媒体的使用,但是在使用多媒体之前,使用模拟器肯定是不行的,所以我们必须要使用真机去进行调试。
一、真机的使用
首先,用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);
}
}
启动调试,看看效果:
这样就成功了。
三、尾言
目前作者比较忙,可能更新速度会有所下降,但是会一直更下去的。