android基础上传单张或多张照片并获取在本地相册的路径
时间: 2024-05-10 22:19:31 浏览: 166
行业文档-设计装置-单张纸全自动多功能纸张加工机.zip
在 Android 中,上传单张或多张照片并获取在本地相册的路径可以通过以下步骤实现:
1. 添加文件读写和相机权限到 AndroidManifest.xml 文件中。
```xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
```
2. 在布局文件中添加一个按钮或者其他视图控件,用于选择照片或者拍照。
```xml
<Button
android:id="@+id/btn_choose_photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Choose Photo" />
```
3. 在 Activity 中添加以下代码,用于处理从相册选择照片或者拍照的事件。
```java
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE_CHOOSE_PHOTO = 1;
private static final int REQUEST_CODE_TAKE_PHOTO = 2;
private Uri mPhotoUri; // 用于保存拍照后的照片的 Uri
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnChoosePhoto = findViewById(R.id.btn_choose_photo);
btnChoosePhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openGallery();
}
});
}
// 打开相册选择照片
private void openGallery() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CODE_CHOOSE_PHOTO);
}
// 打开相机拍照
private void openCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) {
// 创建拍照后保存的文件
File photoFile = createPhotoFile();
if (photoFile != null) {
mPhotoUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", photoFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
startActivityForResult(intent, REQUEST_CODE_TAKE_PHOTO);
}
}
}
// 创建拍照后保存的文件
private File createPhotoFile() {
String fileName = "IMG_" + System.currentTimeMillis() + ".jpg";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
if (storageDir != null && !storageDir.exists()) {
storageDir.mkdirs();
}
File photoFile = new File(storageDir, fileName);
return photoFile;
}
// 处理选择照片或者拍照后的结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_CODE_CHOOSE_PHOTO:
// 从相册选择照片
if (data != null && data.getData() != null) {
Uri uri = data.getData();
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
String filePath = cursor.getString(columnIndex);
cursor.close();
// TODO: 处理选择的照片
}
}
break;
case REQUEST_CODE_TAKE_PHOTO:
// 拍照
if (mPhotoUri != null) {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(mPhotoUri, projection, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
String filePath = cursor.getString(columnIndex);
cursor.close();
// TODO: 处理拍照的照片
}
}
break;
}
}
}
}
```
在该代码中,我们首先定义了两个请求码 REQUEST_CODE_CHOOSE_PHOTO 和 REQUEST_CODE_TAKE_PHOTO,用于在 onActivityResult() 方法中区分从相册选择照片和拍照的结果。然后在 onCreate() 方法中设置了一个按钮的点击事件,用于打开相册选择照片。在 openGallery() 方法中,我们创建了一个 ACTION_PICK 的 Intent,并指定了 MIME 类型为 image/*,然后通过 startActivityForResult() 方法启动该 Intent。在 openCamera() 方法中,我们创建了一个 ACTION_IMAGE_CAPTURE 的 Intent,然后通过 FileProvider.getUriForFile() 方法获取一个文件的 Uri,将该 Uri 保存到 mPhotoUri 变量中,最后通过 startActivityForResult() 方法启动该 Intent。在 createPhotoFile() 方法中,我们创建了一个以当前时间戳命名的文件,该文件存放在应用的外部文件目录下的 PICTURES 文件夹中。在 onActivityResult() 方法中,我们判断 requestCode 是否等于 REQUEST_CODE_CHOOSE_PHOTO 或者 REQUEST_CODE_TAKE_PHOTO,然后根据 resultCode 判断选择照片或者拍照的结果是否成功,并从 Intent 或者 mPhotoUri 中获取照片的 Uri,最后通过 ContentResolver 和 Cursor 获取照片在本地相册中的路径。
注意:在 Android 10 及以上的版本中,应用不能直接访问外部存储上的文件,需要使用 MediaStore API 或者 SAF API 来访问。在上面的代码中,我们使用了 MediaStore.Images.Media.EXTERNAL_CONTENT_URI 和 MediaStore.Images.Media.DATA 来访问外部存储上的照片。如果需要支持 Android 10 及以上的版本,建议使用 SAF API 来访问文件。
阅读全文