从图库或相机中选取的图像获取文件扩展名,作为字符串

问题描述 投票:0回答:11

我想以字符串形式获取从图库加载或从相机中选取的图像的图像扩展名(例如“jpg”、“png”、“bmp”等)。

我使用了这种形式的方法从图库加载图像

    private static final int SELECT_PICTURE_ACTIVITY_REQUEST_CODE = 0;
....
private void selectPicture() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, SELECT_PICTURE_ACTIVITY_REQUEST_CODE);
}
....
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    switch (requestCode) {
        case SELECT_PICTURE_ACTIVITY_REQUEST_CODE:
            if (resultCode == RESULT_OK) {
                Uri selectedImage = imageReturnedIntent.getData();
                String[] filePathColumn = {MediaStore.Images.Media.DATA};
                Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                if (cursor.moveToFirst()) {
                    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                    String filePath = cursor.getString(columnIndex);
                    Bitmap bitmap = BitmapFactory.decodeFile(filePath);
                    .........
                }
                cursor.close();
            }
            break;
    }
}
android android-camera android-gallery
11个回答
76
投票
 filePath.substring(filePath.lastIndexOf(".")); // Extension with dot .jpg, .png

 filePath.substring(filePath.lastIndexOf(".") + 1); // Without dot jpg, png

44
投票

我知道现在已经很晚了,但对于那些在路径包含空格时 getContentResolver().getType(uri) 返回 null 时仍然遇到问题的人来说。这也解决了通过文件管理器而不是图库打开图像时的问题。此方法返回文件的扩展名(jpg、png、pdf、epub 等)。

 public static String getMimeType(Context context, Uri uri) {
    String extension;

    //Check uri format to avoid null
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        //If scheme is a content
        final MimeTypeMap mime = MimeTypeMap.getSingleton();
        extension = mime.getExtensionFromMimeType(context.getContentResolver().getType(uri));
    } else {
        //If scheme is a File
        //This will replace white spaces with %20 and also other special characters. This will avoid returning null values on file name with spaces and special characters.
        extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(new File(uri.getPath())).toString());

    }

    return extension;
}

19
投票
getContentResolver().getType(theReceivedUri);

上面的代码片段为您提供了“媒体/格式”类型


9
投票

亲爱的朋友,我们可以找到任何文件、图像、视频和任何文档的扩展名。 为此。

首先,我们将创建一个方法

GetFileExtension
,我们要调用它来查找文件、图像、数据和文档的扩展名。这里我取了一个名为:

的变量
Uri videouri = data.getData();

in

OnActivity
结果然后我调用它,

onclick(View view)
{
    GetFileExtension(videouri);
    Toast.makeText(this, "Exten: "+GetFileExtension(videouri), Toast.LENGTH_SHORT).show();
}

现在开始上课

GetFileExtension

// Get Extension
public String GetFileExtension(Uri uri)
{
        ContentResolver contentResolver=getContentResolver();
        MimeTypeMap mimeTypeMap=MimeTypeMap.getSingleton();

        // Return file Extension
        return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
}

通过这种方法,我们可以找出java和android中任何文件的扩展名。 我 100% 确信它适合所有制作企业应用程序的人。 如果你喜欢那就投票给我吧..


8
投票

您有多种选择来获取文件扩展名:例如:

1-

String filename = uri.getLastPathSegment();
看到这个链接

2-您也可以使用此代码

 filePath .substring(filePath.lastIndexOf(".")+1);

但这不是一个好的方法。

3-如果您有文件的 URI,则使用此代码

String[] projection = { MediaStore.MediaColumns.DATA,
    MediaStore.MediaColumns.MIME_TYPE };

4-如果您有 URL,则使用此代码

public static String getMimeType(String url) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null) {
    type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
return type;}

6
投票

我认为这应该能让你到达你想要的地方(我还没有尝试过,只是阅读了一下,我认为它有效)。

Uri selectedImage = imageReturnedIntent.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA, 
                           MediaStore.Images.Media.DISPLAY_NAME};
Cursor cursor =
     getContentResolver().query(selectedImage, filePathColumn, null, null, null);
if (cursor.moveToFirst()) {
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    String filePath = cursor.getString(columnIndex);
    Bitmap bitmap = BitmapFactory.decodeFile(filePath);
    int fileNameIndex = cursor.getColumnIndex(filePathColumn[1]);
    String fileName = cursor.getString(fileNameIndex);
    // Here we get the extension you want
    String extension = fileName.replaceAll("^.*\\.", ""); 
    .........
}
cursor.close();

6
投票

对于“内容://”方案

fun Uri.getFileExtension(context: Context): String? {
    return MimeTypeMap.getSingleton()
        .getExtensionFromMimeType(context.contentResolver.getType(this))
}

0
投票

如果您得到

content://media
Uris 作为结果并且您想要扩展名,那么您必须像您一样查询数据库并从
filePath
中提取 if 。例如。与这个

要从完整路径中获取文件名,最简单的解决方案是

String filename = (new File(filePath)).getName();

0
投票

我认为这应该使用

MediaStore.MediaColumns.MIME_TYPE

String[] projection = { MediaStore.MediaColumns.DATA,
        MediaStore.MediaColumns.MIME_TYPE };

0
投票

您可以将字符串拆分为字符串数组并获取它的最后一个索引

 String[] fileArr = picturePath.split("\\.");
    
 String fileExtension = fileArr[fileArr.length - 1];

0
投票

您也可以使用光标获取它。在这里你不仅可以获得文件类型

val contentResolver = context.contentResolver

fun setInfoFile(contentResolver: ContentResolver, uri : Uri) {
    val cursor = contentResolver.query(uri, null, null, null, null)
    
    if (cursor != null && cursor.moveToFirst()) {
        val type = contentResolver.getType(uri).toString()
        val fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
        val bytes = cursor.getString(cursor.getColumnIndex(OpenableColumns.SIZE))
        cursor.close()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.