簡體   English   中英

如何從圖庫中獲取圖像並在ImageView中設置(擴展Fragment)?

[英]How to get image from gallery and set in ImageView (extends Fragment)?

我試圖從圖庫中獲取圖像並在ImageView中顯示該圖像,但出現此錯誤:

    E/ActivityManager: Sending non-protected broadcast com.motorola.motocare.INTENT_TRIGGER from system 4425:com.motorola.process.system/1000 pkg com.motorola.motgeofencesvc
                                                  java.lang.Throwable
                                                      at com.android.server.am.ActivityManagerService.broadcastIntentLocked(ActivityManagerService.java:18179)
                                                      at com.android.server.am.ActivityManagerService.broadcastIntent(ActivityManagerService.java:18779)
                                                      at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:512)
                                                      at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2905)
                                                      at android.os.Binder.execTransact(Binder.java:565)
04-27 17:21:28.696 559-559/? W/SurfaceFlinger: couldn't log to binary event log: overflow.

這里完整的代碼如下:

main.java

    package omcommunication.image;

public class AddWOD extends Fragment implements View.OnClickListener {
Activity activity;

public AddWOD() {
}

; private static int IMG_RESULT = 1;
String ImageDecode;
ImageView imageViewLoad;
Button LoadImage;
Intent intent;
String[] FILE;
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.activity_add_wod, container, false);
     img=(ImageView) view.findViewById(R.id.imgview);
    buy_image1 = (ImageView) view.findViewById(R.id.rent_iv_addpro_image1);
    buy_image1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            intent = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

            startActivityForResult(intent, IMG_RESULT);



        }
    });
     return view;
}

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

        if (requestCode == IMG_RESULT && resultCode == RESULT_OK
                && null != data) {


            Uri URI = data.getData();
            String[] FILE = { MediaStore.Images.Media.DATA };


            Cursor cursor = getActivity().getContentResolver().query(URI,
                    FILE, null, null, null);

            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(FILE[0]);
            ImageDecode = cursor.getString(columnIndex);
            cursor.close();

            img.setImageBitmap(BitmapFactory
                    .decodeFile(ImageDecode));

        }
    } catch (Exception e) {
        Toast.makeText(getActivity(), "Please try again", Toast.LENGTH_LONG)
                .show();
    }

}

我提到了很多問題,但沒有得到必要的東西,是的,我在清單中授予了外部存儲權限。

如果您運行的設備大於Lollipop ,則必須缺少Android Runtime Permissions

您可以在這里參考答案。

最好將Uri移交給圖像加載庫 ,例如Picasso,該不僅可以為您處理所有圖像加載,而且可以在后台線程上進行。

如果您堅持要自己做這些事情,請開始:

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

        if (requestCode == IMG_RESULT && resultCode == RESULT_OK
                && null != data) {
            imageViewLoad.setImageBitmap(BitmapFactory
                    .decodeStream(getContentResolver().openInputStream(data.getData()));

        }
    } catch (Exception e) {
        Toast.makeText(this, "Please try again", Toast.LENGTH_LONG)
                .show();
    }

}

然后,在完成該工作后,切換到使用AsyncTask或其他方法在后台線程上執行decodeStream()部分,並在主應用程序線程上執行setImageBitmap()部分。

特別是,這不應要求您弄亂運行時權限。 正確使用Uri會利用由於用戶選擇圖片而獲得的臨時權限授予。

允許運行時權限的代碼

如果(Build.VERSION.SDK_INT> = 23)

{checkMultiplePermissions();

} private void checkMultiplePermissions(){

    if (Build.VERSION.SDK_INT >= 23) {
        List<String> permissionsNeeded = new ArrayList<String>();
        List<String> permissionsList = new ArrayList<String>();

        if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE)) {
            permissionsNeeded.add("Access Location");
        }

        if (permissionsList.size() > 0) {
            requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
            return;
        }
    }
}

private boolean addPermission(List<String> permissionsList, String permission) {
    if (Build.VERSION.SDK_INT >= 23)

        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);

            // Check for Rationale Option
            if (!shouldShowRequestPermissionRationale(permission))
                return false;
        }
    return true;
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {

            Map<String, Integer> perms = new HashMap<String, Integer>();
            perms.put(Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);


            for (int i = 0; i < permissions.length; i++)
                perms.put(permissions[i], grantResults[i]);
            if (perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                // All Permissions Granted
                return;
            } else {
                // Permission Denied
                if (Build.VERSION.SDK_INT >= 23) {


                }
            }
        }
        break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

它為我工作:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data)
        {
            Uri selectedImg = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };
            Cursor cursor = getActivity().getContentResolver().query(selectedImg,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            buy_image1 .setImageBitmap(BitmapFactory.decodeFile(picturePath));
            cursor.close();
        }
    }

暫無
暫無

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

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