java - 如何从支持 API>=19 和 API<19 的图库中获取图像?

标签 java android android-camera image-gallery

每次我在 Android 中从图库中拍摄图像时,图像都不会导入。

	Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, LOAD_IMAGE_RESULTS);
    

super.onActivityResult(requestCode, resultCode, data);
BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;
if (requestCode == LOAD_IMAGE_RESULTS && resultCode == RESULT_OK
				&& data != null) {
			imgUri = data.getData();
			// Let's read picked image path using content resolver
			String[] filePath = { MediaStore.Images.Media.DATA };
			Cursor cursor = getContentResolver().query(imgUri, filePath, null,
					null, null);
			cursor.moveToFirst();
			String imagePath = cursor.getString(cursor
					.getColumnIndex(filePath[0]));

			bmp = BitmapFactory.decodeFile(imagePath);

			cursor.close();
}
图像并非每次都导入,某些 bmp 在 imageview 上没有设置任何内容。

如何从图库获取图像支持 API>=19 和 API<19 两者...

最佳答案

此代码将解决 SDK < API11SDK >= 11 && SDK < 19SDK > 19 的问题

全局声明

public final int GALLERY_PHOTO = 2;
Bitmap newbitmap;
private Uri fileUri;

使用此方法启动图像选择器

public void callGallery() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"),
            GALLERY_PHOTO);
}

在默认情况下使用此条件@Overide onActivityResult(int requestCode, int resultCode, Intent data)

if (requestCode == GALLERY_PHOTO) {

        if (resultCode == RESULT_OK) {

            // SDK < API11
            if (Build.VERSION.SDK_INT < 11) {

                try {
                    realPath = RealPathUtil.getRealPathFromURI_BelowAPI11(
                            Yourclassname.this,
                            data.getData());
                    setTextViews(Build.VERSION.SDK_INT, data.getData()
                            .getPath(), realPath);
                } catch (Exception e) {

                    e.printStackTrace();
                    Uri selectedImage = data.getData();
                    String[] filePathColumn = { MediaStore.Images.Media.DATA };

                    Cursor cursor = getContentResolver()
                            .query(selectedImage, filePathColumn, null,
                                    null, null);
                    cursor.moveToFirst();

                    int columnIndex = cursor
                            .getColumnIndex(filePathColumn[0]);
                    String filePath = cursor.getString(columnIndex);
                    cursor.close();

                    newbitmap = BitmapFactory.decodeFile(filePath);
                    imageview.setImageBitmap(newbitmap);

                }
            }

            // SDK >= 11 && SDK < 19
            else if (Build.VERSION.SDK_INT < 19) {

                try {
                    realPath = RealPathUtil.getRealPathFromURI_API11to18(
                            yourclassname.this,
                            data.getData());
                    setTextViews(Build.VERSION.SDK_INT, data.getData()
                            .getPath(), realPath);
                } catch (Exception e1) {

                    e1.printStackTrace();
                    Uri selectedImage = data.getData();
                    String[] filePathColumn = { MediaStore.Images.Media.DATA };

                    Cursor cursor = getContentResolver()
                            .query(selectedImage, filePathColumn, null,
                                    null, null);
                    cursor.moveToFirst();

                    int columnIndex = cursor
                            .getColumnIndex(filePathColumn[0]);
                    String filePath = cursor.getString(columnIndex);
                    cursor.close();

                    newbitmap = BitmapFactory.decodeFile(filePath);
                    imageview.setImageBitmap(newbitmap);

                }
            }

            else {
                try {

                    realPath = RealPathUtil.getRealPathFromURI_API19(
                            yourclassname.this,
                            data.getData());

                    setTextViews(Build.VERSION.SDK_INT, data.getData()
                            .getPath(), realPath);

                } catch (Exception e) {

                    Uri selectedImage = data.getData();
                    String[] filePathColumn = { MediaStore.Images.Media.DATA };

                    Cursor cursor = getContentResolver()
                            .query(selectedImage, filePathColumn, null,
                                    null, null);
                    cursor.moveToFirst();

                    int columnIndex = cursor
                            .getColumnIndex(filePathColumn[0]);
                    String filePath = cursor.getString(columnIndex);
                    cursor.close();

                    newbitmap = BitmapFactory.decodeFile(filePath);
                    imageview.setImageBitmap(newbitmap);

                }
            }

            // end

        } else if (resultCode == RESULT_CANCELED) {

            Toast.makeText(getApplicationContext(), "Canceled",
                    Toast.LENGTH_SHORT).show();
        } else {
            // failed to capture image
            Toast.makeText(getApplicationContext(),

                    "Oops!! Failed to pick Image", Toast.LENGTH_SHORT).show();
        }

    }

将此方法包含在您的类中

private void setTextViews(int sdk, String uriPath, String realPath) {

    Uri uriFromPath = Uri.fromFile(new File(realPath));

    fileUri = uriFromPath;

    try {
        newbitmap = BitmapFactory.decodeStream(getContentResolver()
                .openInputStream(fileUri));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }


    imageview.setImageBitmap(newbitmap);

    Log.d("Status", "Build.VERSION.SDK_INT:" + sdk);
    Log.d("Status", "URI Path:" + fileUri);
    Log.d("Status", "Real Path: " + realPath);

}

RealPathUtil.class中创建此辅助方法

public class RealPathUtil {

@SuppressLint("NewApi")
public static String getRealPathFromURI_API19(Context context, Uri uri){
    String filePath = "";
    String wholeID = DocumentsContract.getDocumentId(uri);

     // Split at colon, use second item in the array
     String id = wholeID.split(":")[1];

     String[] column = { MediaStore.Images.Media.DATA };     

     // where id is equal to             
     String sel = MediaStore.Images.Media._ID + "=?";

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

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

     if (cursor.moveToFirst()) {
         filePath = cursor.getString(columnIndex);
     }   

     cursor.close();

     return filePath;
}


@SuppressLint("NewApi")
public static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {
      String[] proj = { MediaStore.Images.Media.DATA };
      String result = null;

      CursorLoader cursorLoader = new CursorLoader(
              context, 
        contentUri, proj, null, null, null);        
      Cursor cursor = cursorLoader.loadInBackground();

      if(cursor != null){
       int column_index = 
         cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
       cursor.moveToFirst();
       result = cursor.getString(column_index);
      }

      return result;  
}

public static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){
           String[] proj = { MediaStore.Images.Media.DATA };
           Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
           int column_index
      = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
           cursor.moveToFirst();
           return cursor.getString(column_index);
   }
}

希望这能解决您的问题。

关于java - 如何从支持 API>=19 和 API<19 的图库中获取图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28342678/

相关文章:

android - 如何在android中组合覆盖位图和捕获的图像?

java - 如何在 RecyclerView 中创建广告?

c# - Java 等同于 C# 中的 IEnumerator?

java - 在 debian Jessie 中安装 Java 8

Java SwingWorker 与 JDialog 在 JDBC 网络操作期间显示 JProgressBar

android - 仅从 Firebase 返回需要的值

android - 如何在更改布局管理器时为 Recycler-View 设置动画

Android相机 Intent 在拍摄肖像时保存图像风景

android - 来自本地存储的 Titanium 3.X getFile()

android - Camera Source (Google Mobile Vision) 在某些设备上返回旋转图像