bugfix> android > 投稿

私はGoogleドライブでgetPickChooserIntentを呼び出してファイルを取得するAndroidアプリに取り組んでいます。ドキュメントではなく画像でうまく動作しています:

注:GoogleドライブAPIの実装については説明していません。

public static Intent getPickChooserIntent(
      @NonNull Context context,
      CharSequence title,
      boolean includeDocuments,
      boolean includeCamera) {
    List<Intent> allIntents = new ArrayList<>();
    PackageManager packageManager = context.getPackageManager();
    // collect all camera intents if Camera permission is available
    if (!isExplicitCameraPermissionRequired(context) && includeCamera) {
      allIntents.addAll(getCameraIntents(context, packageManager));
    }
    List<Intent> galleryIntents =
        getGalleryIntents(packageManager, Intent.ACTION_GET_CONTENT, includeDocuments);
    if (galleryIntents.size() == 0) {
      // if no intents found for get-content try pick intent action (Huawei P9).
      galleryIntents = getGalleryIntents(packageManager, Intent.ACTION_PICK, includeDocuments);
    }
    allIntents.addAll(galleryIntents);
    Intent target;
    if (allIntents.isEmpty()) {
      target = new Intent();
    } else {
      target = allIntents.get(allIntents.size() - 1);
      allIntents.remove(allIntents.size() - 1);
    }
    // Create a chooser from the main  intent
    Intent chooserIntent = Intent.createChooser(target, title);
    // Add all other intents
    chooserIntent.putExtra(
        Intent.EXTRA_INITIAL_INTENTS, allIntents.toArray(new Parcelable[allIntents.size()]));
    return chooserIntent;
  }

getPickImageChooserIntent(Context)から選択した画像のURIを取得します 正しいURIを返します。

public static Uri getPickImageResultUri(@NonNull Context context, @Nullable Intent data) {
    boolean isCamera = true;
    if (data != null && data.getData() != null) {
      String action = data.getAction();
      isCamera = action != null && action.equals(MediaStore.ACTION_IMAGE_CAPTURE);
    }
    return isCamera || data.getData() == null ? getCaptureImageOutputUri(context) : data.getData();
  }

その後、次のようなURIを見つけます: content://com.google.android.apps.docs.storage.legacy/enc%3D8HXM7NIDpCn_Ax78iaO3nB9azNXlIu4AOk2poROCD8xP19KU%0A

このURIは、ImageViewで画像および表示画像に対して正常に機能しますが、そのときにPDFまたは他のドキュメントを選択すると機能しません。

GoogleドライブAPIを統合せずに、Googleドライブからインテントデータを取得するというアイデアはありますか?

ありがとう

回答 1 件
  • ついにやった!

    解決:

    @Override
        @SuppressLint("NewApi")
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == CropImage.PICK_IMAGE_CHOOSER_REQUEST_CODE) {
                if (resultCode == Activity.RESULT_OK) {
    
                 Uri mUri = CropImage.getPickImageResultUri(this, data);
                 writeStreamToFile(getApplicationContext(),mUri,".pdf");
                }
            }
        }
    
    

    方法:

      @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        void writeStreamToFile(Context mContext, Uri mUri,String ext) {
            if (mUri == null) {
                return;
            }
            String[] filePathColumn = {MediaStore.Images.Media.DATA};
            Cursor cursor = mContext.getContentResolver().query(mUri, filePathColumn, null, null, null);
            String mCurrentPath = null;
            if (cursor != null && cursor.moveToFirst()) {
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                mCurrentPath = cursor.getString(columnIndex);
                cursor.close();
            }
            if (TextUtils.isEmpty(mCurrentPath)) {
                mCurrentPath = mUri.getPath();
            }
            File storageDir = mContext.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
            InputStream inputStream = null;
            try {
                inputStream = mContext.getContentResolver().openInputStream(mUri);
                File file = File.createTempFile("pptFiles", ext, storageDir);
                try (OutputStream output = new FileOutputStream(file)) {
                    byte[] buffer = new byte[4 * 1024]; // or other buffer size
                    int read;
                    while ((read = inputStream.read(buffer)) != -1) {
                        output.write(buffer, 0, read);
                    }
                    output.flush();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    

あなたの答え