当前位置: 首页 > 知识库问答 >
问题:

AndroidQ:从系统库选取器获取图像,并在下一个活动中对其应用效果

孙嘉悦
2023-03-14

开放画廊意向

 Intent galleryIntent = new Intent( Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        galleryIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivityForResult(galleryIntent, FILE_REQUEST);
           

非活动结果

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
     selected_photo = data.getData();

     String[] filePath = {MediaStore.Images.Media.DATA};
     Cursor c = getContentResolver().query(selected_photo, filePath,null, null, null);
     c.moveToFirst();
     int columnIndex = c.getColumnIndex(filePath[0]);
     picturePath = c.getString(columnIndex);
     c.close();

     Intent i = new Intent(First.this, Second.class);
     i.putExtra("pic", picturePath);
     startActivity(i);
  }

第一个活动日志

E/BitmapFactory:无法解码流:java。伊奥。FileNotFoundException:46:打开失败:eNote(没有这样的文件或目录)

在下一个活动中,我发现这个函数中有错误

public Bitmap decodeBitmapFromPath(String filePath) {
    Bitmap scaledBitmap = null;

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    scaledBitmap = BitmapFactory.decodeFile(filePath, options);

    options.inSampleSize = calculateInSampleSize(options, 30, 30);
    options.inDither = false;
    options.inPurgeable = true;
    options.inInputShareable = true;
    options.inJustDecodeBounds = false;

    scaledBitmap = BitmapFactory.decodeFile(filePath, options);

    ExifInterface exif;
    try {
        exif = new ExifInterface(filePath);

        int orientation = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION, 0);
        Matrix matrix = new Matrix();
        if (orientation == 6) {
            matrix.postRotate(90);
        } else if (orientation == 3) {
            matrix.postRotate(180);
        } else if (orientation == 8) {
            matrix.postRotate(270);
        }
        scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
                true);

        eW = scaledBitmap.getWidth();
        eH = scaledBitmap.getHeight();
        eM = matrix;

    } catch (IOException e) {
        e.printStackTrace();
        FirebaseCrashlytics.getInstance().recordException(e);
    }
    return scaledBitmap;
}

第二个活动日志

JAVA伊奥。FileNotFoundException:46:open失败:在libcore上没有这样的文件或目录。伊奥。伊奥布里奇。在java上打开(IoBridge.java:492)。伊奥。文件输入流。(FileInputStream.java:160)在java上。伊奥。文件输入流。(FileInputStream.java:115)在android上。媒体出口接口。android上的initForFilename(ExifInterface.java:2531)。媒体出口接口。(ExifInterface.java:1500)在。第二项活动。decodeBitmapFromPath(SecondActivity.java:889)

现在,我如何在下一个活动中以位图的形式访问这张照片,并对其应用不同的效果?

共有1个答案

曹普松
2023-03-14

如果您想从图库中选择图像,请尝试这个新的应用编程接口。它被称为ActivityResultLauncher

你不需要记住任何请求代码就可以得到结果,而且很容易使用

按照以下步骤从存储中访问图像并将其转换为位图:

>

ActivityResultLauncher<String> mGetContent = 
         registerForActivityResult(new GetContent(), new ActivityResultCallback<Uri>() {
 @Override
 public void onActivityResult(Uri uri) {
   // Handle the returned Uri, We will get a bitmap from it here.

 }
});

然后,点击按钮或任何你想要的地方启动系统图像选择器。

mGetContent.launch("image/*");

>

  • 来自Uri方法的位图。

    public statice Bitmap getBitmapFromUri(Context ctx, Uri uri) {
         try {
              if (uri != null) {
                  Bitmap bitmap =
                      MediaStore.Images.Media.getBitmap(ctx.getContentResolver(), uri);
              }
          } catch (Exception e) {
              //handle exception
          }
      }
    

    现在你可以在任何地方使用位图了。

  •  类似资料:
    • 但是宽度和高度较低的图像成功地加载到图像视图中! 有人能告诉我代码有什么问题吗?我做错了什么?我只想从库中导入相机图像,并在图像视图中显示它们!

    • 所以有一点问题(这与-由于背景进程限制导致的相机崩溃有关 我有相当多的用户的手机将“不要保留活动”设置或“后台进程”设置为2或类似的东西,当打开其他意图时,这将导致应用程序似乎“崩溃” 所以我有一个类似这样的问题 Gallery的EXTRA_OUTPUT被忽略-它适用于相机(在onResume之后,我有临时图像的URI,之后我会处理它) 但是我该为本地画廊做些什么呢? 我目前从相机拍照的过程是 <

    • 我想使用共享命令从图库获取图像。 我目前的代码是: imageUri 的值为:content://media/external/images/media/37 但是函数“openInputStream”会抛出错误“java.io.FileNotFoundException”。 通过下面的函数,我得到了图像的真实路径。 但我不知道如何将其转换为位图。

    • 目前我有一个问题,当我从画廊回来时,活动被销毁并重新创建。 以下是步骤: > 从“照片片段”开始,我打算从图库中挑选图像: 转到我的应用程序(当前来自图库),并选择从第3步捕获的图像。 --- 你知道我的活动是如何重新创建的吗?以及如何修复?< br >我为此花了将近一天的时间,但还是没有结果。 任何帮助都非常感谢。谢谢。

    • 问题内容: 我的应用程序中包含许多产品的网格。当用户选择网格中的一个项目时,我将启动一个新的“对话框”框,并显示该项目的名称,数量和图像。但是我不能动态发送图像源。 这是我的代码 我应该使用什么来从ImageView获取图像源? 问题答案: 像这样使用Bundle

    • 获取系统首选项 进程: 主进程 例子: 1 const {systemPreferences} = require('electron') 2 console.log(systemPreferences.isDarkMode()) Copied! 事件列表 systemPreferences 对象提供以下事件: 事件: 'accent-color-changed' Windows 触发:用户在个性