簡體   English   中英

onActivityResult需要幫助獲取圖像

[英]onActivityResult need help getting image

我正在嘗試通過使用startActivityForResult啟動Intent從照片庫中進行選擇並覆蓋onActivityResult來獲取圖像。 我不知道為什么,但是當我選擇圖像並嘗試在屏幕上繪制時,什么也沒有發生。 我可以選擇圖像,然后就是它。

我搜索了答案,但找不到任何有幫助的內容。 我似乎沒有多少可以嘗試解決的問題。 我相信我已經正確實施了所有內容。 這也是我第一次嘗試這樣做,所以我可能是錯的。 當我調用getGalleryImage()時,我重寫了onActivityResult來獲取位圖並從另一個類中設置位圖變量。

從我的GameView類啟動Intent:

MainActivity activity = (MainActivity) context;

public void getGalleryImage() {
    Intent gallery = new Intent(Intent.ACTION_PICK);
    gallery.setType("image/*");
    String[] mimeTypes = { "image/png" };
    gallery.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
    activity.startActivityForResult(gallery, 1);
}

MainActivity中的Override方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        if (resultCode == MainActivity.RESULT_OK) {
            final Uri uri = data.getData();
            InputStream in;
            try {
                in = getContentResolver().openInputStream(uri);
                final Bitmap selected_img = BitmapFactory.decodeStream(in);
                view.setSelectedImage(selected_img);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                Toast.makeText(this, "An error occured!", Toast.LENGTH_LONG).show();
            }
        } else {
            Toast.makeText(this, "You didn't pick an image!", Toast.LENGTH_LONG).show();
        }
    }
}

我想獲取圖像並將其繪制到屏幕上。 發生的事情是在意圖打開后我選擇了圖像,然后什么也沒有。 它可以追溯到我的活動,似乎一點都沒畫。

您必須提供android版本7(牛軋糖)中的提供程序

清單中的第一組提供程序

</application>
    <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

  </application>

接下來,在resource的xml文件夾內定義一個名為filepaths的xml文件路徑:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="external_files"
        path="." />
</paths>

下次調用意圖選擇圖像:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
String[] mimeTypes = {"image/jpeg", "image/png"};
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
startActivityForResult(intent, GALLERY_REQUEST_CODE);

在您的活動結果中:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Uri selectedImage = null;

        if (requestCode == GALLERY_REQUEST_CODE) {
            if (resultCode == Activity.RESULT_OK) {
                if (data != null) {
                    selectedImage = data.getData();
                    InputStream in;
                    try {
                        in = getContentResolver().openInputStream(uri);
                        final Bitmap selected_img = BitmapFactory.decodeStream(in);
                        yourimageview.setImageBitmap(selected_img);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                        Toast.makeText(this, "An error occured!", Toast.LENGTH_LONG).show();
                    }
                }
            }
        }

好像您的View.setSelectedImage()來自自定義類,您可能想嘗試嘗試首先在ImageView上繪制Bitmap ,以查看其是否起作用。

改用ImageView並從onActivityResult()內調用ImageView.setImageBitmap(bitmap) onActivityResult() 並且確保解碼的位圖不會太大,因為它可能導致您的應用結結,並且您可能想嘗試有效地加載大的位圖

另外,將您的getGalleryImage()方法更新為此:

public void getGalleryImage() {
    final Intent galleryIntent = Intent(Intent.ACTION_GET_CONTENT);
    galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);
    galleryIntent.setType("image/*");
    startActivityForResult(galleryIntent, 1);
}

暫無
暫無

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

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