簡體   English   中英

圖像內容提供商是否有“庫存”選擇器?

[英]Is there a "stock" chooser for image content providers?

例如,當我想在股票消息應用程序中將圖像附加到文本消息時,我會看到一個熟悉的系統對話框,其中顯示了相機、圖庫和其他圖像內容提供程序。

我想在我自己的應用程序中使用它。 我看到很多庫允許用戶在圖庫和相機之間進行選擇,但我希望顯示用戶安裝的所有圖像源。

Messages(以及其他常用應用程序,例如 Mail)中的系統對話框真的是為這些應用程序定制的嗎? 我們真的需要建立自己的嗎? 存儲訪問框架似乎不是正確的解決方案,因為它繞過了相機(或我沒有想到但可能存在於用戶設備上的其他圖像源)。

您要求的事情可以使用系統訪問框架工作來完成。 在清單文件中添加存儲權限,然后檢查權限是否被接受。 然后您可以打開打開的文檔選擇讓用戶選擇圖像。

代碼

里面有些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 默認文件選擇器

我建議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);
  }

它將打開一個這樣的對話框,其中包含可用作圖像選擇器的所有用戶應用程序: 在此處輸入圖片說明

然后當用戶選擇圖像時:

   @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;
          }

我建議使用ArthurHub 的android 圖像Android-Image-Cropper

它為您提供了您正在尋找的所有選項在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM