代码之家  ›  专栏  ›  技术社区  ›  JoshJordan

图像内容提供商是否有“库存”选择器?

  •  1
  • JoshJordan  · 技术社区  · 6 年前

    例如,当我想将图像附加到stock messages应用程序中的文本消息时,我会得到一个熟悉的系统对话框,显示相机、图库和其他图像内容提供商。

    我想在我自己的应用程序中使用这个。我看到很多库允许用户在画廊和照相机之间进行选择,但我想 全部的 显示用户已安装的图像源。

    消息(和其他常用应用程序,如邮件)的系统对话框是否真的是为这些应用程序定制的?我们真的需要自己建造吗?存储访问框架似乎不是正确的解决方案,因为它绕过了相机(或者我没有想到但可能存在于用户设备上的其他图像源)。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Marzi Heidari    6 年前

    我建议 Intent.ACTION_PICK

      private void selectFileFromGallery() {
        Intent intent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/*");
    
    
        startActivityForResult(Intent.createChooser(intent,
            "Select Picture"), requestGallery);
      }
    

    它将打开这样一个对话框,其中包含可用作图像选取器的所有用户应用程序: enter image description here

    然后当用户选择图像时:

       @Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
          if (requestCode == requestGallery) {
            onSelectFromGalleryResult(data);
          }
        }
    
               @SuppressWarnings("deprecation")
              private void onSelectFromGalleryResult(Intent data) {
                Uri uri = data.getData();
                if (!uri.toString().contains("file")) {
                  if (uri.toString().contains("external")) {//chosen from external storage
                    photoUri = Uri.parse("file://" + getRealPathFromURI(uri));
                  } else {
                    photoUri = Uri.parse("file://" + (Build.VERSION.SDK_INT <= 18
                        ? getRealPathFromURI_API11to18(getActivity(), uri) :
                        getRealPathFromURI_API19(getActivity(), uri)));
                  }
    
                }
    
              @SuppressLint("NewApi")
              private String getRealPathFromURI_API19(Context context, Uri uri) {
                return RealPathUtil.INSTANCE.getRealPathFromURI_API19(context, uri);
              }
    
          public String getRealPathFromURI(Uri contentUri) {
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor cursor = getActivity().managedQuery(contentUri, proj, null, null, null);
            int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
          }
              @SuppressLint("NewApi")
              private 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;
              }
    
        2
  •  1
  •   Sayok Majumder    6 年前

    您所要求的事情可以使用系统访问框架来完成。 在清单文件中添加存储权限,然后检查是否接受该权限。然后可以打开打开文档选择,让用户选择图像。

    代码

    在某个onclick里面

    Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    i.addCategory(Intent.CATEGORY_OPENABLE);
    i.setType("image/*");
    startActivityForResult(i, 41);
    

    这将只为图像文件打开文件选择器活动。

    然后你可以在里面得到结果:

     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK){
            if (requestCode == 41) {
                if (data != null) {
                    Uri uri = data.getData();
                    //This is the uri to the file
                    //To get the file use the uri
                }
            }
        }
    }
    

    您仍然需要自己创建BottomSheetDialog,但是您的工作将大大减少,因为只有2个选项:1。相机应用程序,2。文件选择器。您必须自己处理摄像机事件并获取图像URI。

    Android Default File Chooser

        3
  •  0
  •   113408 Dmitry    6 年前

    我建议使用安卓图像 Android-Image-Cropper by ArthurHub

    它给了你所有你想要的选择 enter image description here