本文主要是介绍Android多媒体之调用摄像头和相册,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Android调用摄像头拍照的使用
- 权限申请:
- 在AndroidManifest.xml文件中添加摄像头使用权限:
<uses-permission android:name="android.permission.CAMERA"/>
- 如果需要存储图片,还需要添加文件读写权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 注意:在Android 6.0及以上版本,需要动态申请权限。
- 在AndroidManifest.xml文件中添加摄像头使用权限:
- 打开摄像头:
- 通过设置Intent来实现,指定Action为
MediaStore.ACTION_IMAGE_CAPTURE
。 - 如果需要处理拍照后的数据,可以使用
startActivityForResult()
方法启动相机。
- 通过设置Intent来实现,指定Action为
- 拍照后传回数据处理:
- 在
onActivityResult()
方法中处理返回的Intent,从中获取拍照后的图片数据。 - 可以使用
data.getData()
方法获取图片的Uri,然后使用图片加载库(如Glide)加载并显示图片。
- 在
- 存储图片:
- 在Android 7.0(API级别24)及以上版本,由于安全性的考虑,不再允许直接使用
file://
URI。因此,需要使用FileProvider
来共享文件。 - 在AndroidManifest.xml中定义
FileProvider
,并配置相应的<meta-data>
标签。 - 创建一个File对象来存储拍照后的图片,并使用
FileProvider.getUriForFile()
方法获取该文件的Uri。
- 在Android 7.0(API级别24)及以上版本,由于安全性的考虑,不再允许直接使用
- 代码实现:
首先,确保在
AndroidManifest.xml
中添加了必要的权限:<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在
Activity
中:import android.Manifest;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.IOException;
public class CameraActivity extends AppCompatActivity {
private static final int REQUEST_CAMERA_PERMISSION = 1;
private static final int REQUEST_IMAGE_CAPTURE = 2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
REQUEST_CAMERA_PERMISSION);
} else {
dispatchTakePictureIntent();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
dispatchTakePictureIntent();
}
}
}
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.android.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
CurrentPhotoPath = image.getAbsolutePath();
return image;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
// Handle the image here (e.g., display it in an ImageView)
// You can access the image file at CurrentPhotoPath
}
}
// Other necessary methods and variables
从相册中选择图片的使用
- 权限申请:
- 与调用摄像头拍照相同,需要添加文件读写权限。
- 打开相册:
- 通过设置Intent来实现,指定Action为
Intent.ACTION_PICK
,并使用setDataAndType()
方法设置数据类型为图片。 - 同样,使用
startActivityForResult()
方法启动相册。
- 通过设置Intent来实现,指定Action为
- 选择图片后处理:
- 在
onActivityResult()
方法中处理返回的Intent,从中获取用户选择的图片Uri。 - 使用图片加载库加载并显示图片。
- 在
- 代码实现
要在Android应用中实现从相册中选择图片的功能,你需要使用
Intent.ACTION_GET_CONTENT
。以下是如何实现这一功能的代码示例:import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
public class AlbumActivity extends AppCompatActivity {
private static final int REQUEST_SELECT_IMAGE = 3;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_album);
// 启动相册选择图片
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_IMAGE);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_SELECT_IMAGE && resultCode == RESULT_OK) {
if (data != null) {
Uri selectedImageUri = data.getData();
// 这里可以根据Uri进行图片处理,比如加载到ImageView中
// 注意:对于Android 10 (API 级别 29) 及更高版本,你可能需要处理Scoped Storage
// 如果你需要获取Bitmap对象,可以这样做(但请注意,这可能会消耗大量内存)
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImageUri);
// 使用Bitmap对象
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
总结:
调用摄像头拍照和从相册中选择图片在Android中都是常见的功能。它们都需要申请相应的权限,并通过设置Intent来启动相应的Activity。对于拍照功能,还需要考虑图片的存储和Uri的获取;对于从相册选择图片,主要是处理用户选择的图片Uri。在实际开发中,可以结合使用这些功能,为用户提供更丰富的图片获取方式。
这篇关于Android多媒体之调用摄像头和相册的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!