Java 在棒棒糖中加载JPEG图像(5.1.1)

Java 在棒棒糖中加载JPEG图像(5.1.1),java,android,bitmap,jpeg,Java,Android,Bitmap,Jpeg,我想在Android应用程序上加载JPEG图像作为位图对象。我使用的是Android 5.1.1 API 22。我目前正在使用以下代码加载位图,其中jpg是我之前拍摄的图像的文件: File root = Environment.getExternalStorageDirectory(); BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = false; bmO

我想在Android应用程序上加载JPEG图像作为位图对象。我使用的是Android 5.1.1 API 22。我目前正在使用以下代码加载位图,其中jpg是我之前拍摄的图像的文件:

File root = Environment.getExternalStorageDirectory();
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = 1;
Bitmap bMap = BitmapFactory.decodeFile(jpg.getAbsolutePath(),bmOptions);
我正在尝试对上面提取的位图执行图像处理:

int width = bMap.getWidth();
int height = bMap.getHeight();
我在清单文件中设置了以下权限:

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="18" />
所以本质上它是说位图为null(logcat中的最后一行)


在安卓5.1.1上有没有其他人遇到过这个问题;API 22?或者有人有不同的方法吗?任何帮助都将不胜感激!谢谢:)

如果您从“多媒体资料”中选择位图图像,则可能是您获得的路径不正确。 添加一个名为file_paths.XML的新XML文件

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
 <external-path name="my_images"
    path="." />
</paths>

在AndroidManifest中添加此内部标记

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths">
        </meta-data>
    </provider>

在这项活动中:

public String getPathFromURI(Uri contentUri) {
    try {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            String res = "";
            String[] proj = {MediaStore.Images.Media.DATA};
            Cursor cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
            if (cursor.moveToFirst()) {
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                res = cursor.getString(column_index);
            }
            cursor.close();
            return res;
        } else {
            String res = "";
            String wholeID = null;
            wholeID = DocumentsContract.getDocumentId(contentUri);
            String id = wholeID.split(":")[1];

            String[] column = {MediaStore.Images.Media.DATA};
            String sel = MediaStore.Images.Media._ID + "=?";

            Cursor cursor = getActivity().getContentResolver().
                    query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            column, sel, new String[]{id}, null);

            int columnIndex = cursor.getColumnIndex(column[0]);

            if (cursor.moveToFirst()) {
                res = cursor.getString(columnIndex);
            }
            cursor.close();
            return res;
        }
    } catch (Exception e) {
        Cursor cursor = null;
        try {
            String[] proj = {MediaStore.Images.Media.DATA};
            cursor = getContext().getContentResolver().query(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } catch (Exception ex) {
            return null;
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }
}
公共字符串getPathFromURI(Uri contentUri){
试一试{
if(Build.VERSION.SDK_INT
似乎是视图问题,而不是位图问题。你能告诉我们你调用这个代码的地方吗?视图没有问题。该视图引发错误,因为参考底图为空,因此无法绘制@贾斯汀·麦克弗森:你确定jpeg文件的路径正确吗?您可以使用文件对象来检查这一点,然后使用.exists()方法进行检查。
android:maxSdkVersion=“18”
——假设您正在使用
WRITE\u EXTERNAL\u STORAGE
作为其隐式
READ\u EXTERNAL\u STORAGE
,则在SDK版本>18上仍然需要该权限。删除该
maxSdkVersion
属性。
public String getPathFromURI(Uri contentUri) {
    try {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            String res = "";
            String[] proj = {MediaStore.Images.Media.DATA};
            Cursor cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
            if (cursor.moveToFirst()) {
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                res = cursor.getString(column_index);
            }
            cursor.close();
            return res;
        } else {
            String res = "";
            String wholeID = null;
            wholeID = DocumentsContract.getDocumentId(contentUri);
            String id = wholeID.split(":")[1];

            String[] column = {MediaStore.Images.Media.DATA};
            String sel = MediaStore.Images.Media._ID + "=?";

            Cursor cursor = getActivity().getContentResolver().
                    query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            column, sel, new String[]{id}, null);

            int columnIndex = cursor.getColumnIndex(column[0]);

            if (cursor.moveToFirst()) {
                res = cursor.getString(columnIndex);
            }
            cursor.close();
            return res;
        }
    } catch (Exception e) {
        Cursor cursor = null;
        try {
            String[] proj = {MediaStore.Images.Media.DATA};
            cursor = getContext().getContentResolver().query(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } catch (Exception ex) {
            return null;
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }
}