legongju.com
我们一直在努力
2024-12-24 10:31 | 星期二

android photopicker 怎样筛选图片

在Android中,要创建一个带有筛选功能的图片选择器,你可以使用Intent结合系统自带的图库应用或者其他第三方图库应用。以下是一个简单的示例,展示了如何使用Intent来创建一个图片选择器,并筛选出特定类型的图片(例如,只显示JPEG格式的图片)。

首先,确保在你的AndroidManifest.xml文件中添加了读取外部存储的权限:


然后,在你的Activity中添加以下代码:

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class ImagePickerActivity extends AppCompatActivity {

    private static final int REQUEST_CODE_PICK_IMAGE = 1;
    private static final int REQUEST_CODE_FILTER_IMAGE = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_picker);

        Button selectImageButton = findViewById(R.id.select_image_button);
        selectImageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openImagePicker();
            }
        });
    }

    private void openImagePicker() {
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/*");
        startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE_PICK_IMAGE && resultCode == RESULT_OK && data != null) {
            Uri selectedImageUri = data.getData();
            List filteredImagePaths = filterImage(selectedImageUri);
            if (!filteredImagePaths.isEmpty()) {
                Toast.makeText(this, "Selected image: " + filteredImagePaths.get(0), Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "No image found or filtering failed.", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private List filterImage(Uri selectedImageUri) {
        List imagePaths = new ArrayList<>();
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(selectedImageUri, projection, null, null, null);

        if (cursor != null) {
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();

            do {
                String imagePath = cursor.getString(columnIndex);
                if (isJpegImage(imagePath)) {
                    imagePaths.add(imagePath);
                }
            } while (cursor.moveToNext());

            cursor.close();
        }

        return imagePaths;
    }

    private boolean isJpegImage(String imagePath) {
        String mimeType = getMimeType(imagePath);
        return mimeType != null && mimeType.startsWith("image/jpeg");
    }

    private String getMimeType(String filePath) {
        Uri uri = Uri.fromFile(new File(filePath));
        String[] projection = {MediaStore.Images.Media.MIME_TYPE};
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);

        if (cursor != null) {
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.MIME_TYPE);
            cursor.moveToFirst();
            String mimeType = cursor.getString(columnIndex);
            cursor.close();
            return mimeType;
        }

        return null;
    }
}

在这个示例中,我们首先使用Intent打开系统的图库应用,让用户选择一张图片。然后,我们在onActivityResult方法中获取选中的图片的URI,并使用filterImage方法筛选出JPEG格式的图片。isJpegImage方法用于检查图片是否为JPEG格式,getMimeType方法用于获取图片的MIME类型。

请注意,这个示例仅适用于Android 10及更高版本,因为从Android 10开始,隐私策略发生了变化,需要使用MediaStore API来访问外部存储。如果你的应用需要支持Android 9及更低版本,你需要使用不同的方法来访问外部存储和处理图片筛选。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/50973.html

相关推荐

  • android zygote为何不稳定

    android zygote为何不稳定

    Android Zygote进程的不稳定可能由多种因素导致,以下是一些可能的原因:
    Zygote进程的作用
    Zygote是Android系统中的一个关键进程,负责启动新的应用进...

  • android zygote怎样监控状态

    android zygote怎样监控状态

    Android Zygote是Android系统的启动进程,它负责启动系统的核心服务。要监控Zygote的状态,你可以使用Android Debug Bridge (ADB)工具。以下是监控Zygote状态的步...

  • android zygote能处理多少进程

    android zygote能处理多少进程

    Android的Zygote进程是系统启动时创建的,用于孵化新的应用程序进程。它本身并没有直接限制可以处理多少进程,但其处理能力受到系统资源(如内存、CPU核心数等)...

  • android zygote如何改进

    android zygote如何改进

    Android Zygote是Android系统中的一个关键进程,它负责通过fork操作创建新的应用程序进程,从而提高了应用程序的启动效率。以下是对Zygote进程改进的相关信息:<...

  • c++ volatile的函数参数

    c++ volatile的函数参数

    在C++中,volatile关键字用于告诉编译器,一个变量可能会被程序之外的代码(例如操作系统、硬件或其他线程)意外地修改,因此编译器在访问该变量时不应该进行优化...

  • c++ volatile的指针使用

    c++ volatile的指针使用

    在C++中,volatile关键字用于告诉编译器,变量的值可能在任何时候被外部因素(如硬件、其他线程等)改变,因此编译器在访问该变量时不应该进行优化。这对于指针变...

  • c++ volatile的数据类型

    c++ volatile的数据类型

    在C++中,volatile是一个类型修饰符,用于告诉编译器该变量的值可能会被程序之外的因素(如硬件、操作系统或其他线程)意外地改变。因此,编译器在访问该变量时不...

  • c++ volatile的初始化

    c++ volatile的初始化

    在C++中,volatile关键字用于告诉编译器,一个变量的值可能会被程序之外的因素(如硬件、操作系统或其他线程)改变,因此编译器在访问该变量时不应该进行优化。v...