【问题标题】:get all image from gallery and store in array从图库中获取所有图像并存储在数组中
【发布时间】:2018-09-16 20:18:09
【问题描述】:

我有为图像定义的代码(可绘制) 表示 Image 已定义,但我希望用户从 Gallery 中选择 Image 。 所以首先我想从图库中获取所有图片,然后将其显示在视图中,并且他们的用户可以选择 Image 。

所以这意味着所有图像必须保存在数组中,如下所示。 任何帮助。

public class StickerSelectActivity extends AppCompatActivity {

    public static final String EXTRA_STICKER_ID = "extra_sticker_id";

    private final int[] stickerIds = {
            R.drawable.abra,
            R.drawable.bellsprout,
            R.drawable.bracelet,
            R.drawable.bullbasaur,
            R.drawable.camera,
            R.drawable.candy,
            R.drawable.caterpie,
            R.drawable.charmander,
            R.drawable.mankey,
            R.drawable.map,
            R.drawable.mega_ball,
            R.drawable.meowth,
            R.drawable.pawprints,
            R.drawable.pidgey,
            R.drawable.pikachu,
            R.drawable.pikachu_1,
            R.drawable.pikachu_2,
            R.drawable.player,
            R.drawable.pointer,
            R.drawable.pokebag,
            R.drawable.pokeball,
            R.drawable.pokeballs,
            R.drawable.pokecoin,
            R.drawable.pokedex,
            R.drawable.potion,
            R.drawable.psyduck,
            R.drawable.rattata,
            R.drawable.revive,
            R.drawable.squirtle,
            R.drawable.star,
            R.drawable.star_1,
            R.drawable.superball,
            R.drawable.tornado,
            R.drawable.venonat,
            R.drawable.weedle,
            R.drawable.zubat
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.select_sticker_activity);

        //noinspection ConstantConditions
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.stickers_recycler_view);
        GridLayoutManager glm = new GridLayoutManager(this, 3);
        recyclerView.setLayoutManager(glm);

        List<Integer> stickers = new ArrayList<>(stickerIds.length);
        for (Integer id : stickerIds) {
            stickers.add(id);
        }

        recyclerView.setAdapter(new StickersAdapter(stickers, this));
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            onBackPressed();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void onStickerSelected(int stickerId) {
        Intent intent = new Intent();
        intent.putExtra(EXTRA_STICKER_ID, stickerId);
        setResult(RESULT_OK, intent);
        finish();
    }

    class StickersAdapter extends RecyclerView.Adapter<StickersAdapter.StickerViewHolder> {

        private final List<Integer> stickerIds;
        private final Context context;
        private final LayoutInflater layoutInflater;

        StickersAdapter(@NonNull List<Integer> stickerIds, @NonNull Context context) {
            this.stickerIds = stickerIds;
            this.context = context;
            this.layoutInflater = LayoutInflater.from(context);
        }

        @Override
        public StickerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new StickerViewHolder(layoutInflater.inflate(R.layout.sticker_item, parent, false));
        }

        @Override
        public void onBindViewHolder(StickerViewHolder holder, int position) {
            holder.image.setImageDrawable(ContextCompat.getDrawable(context, getItem(position)));
        }

        @Override
        public int getItemCount() {
            return stickerIds.size();
        }

        private int getItem(int position) {
            return stickerIds.get(position);
        }

        class StickerViewHolder extends RecyclerView.ViewHolder {

            ImageView image;

            StickerViewHolder(View itemView) {
                super(itemView);
                image = (ImageView) itemView.findViewById(R.id.sticker_image);
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        int pos = getAdapterPosition();
                        if (pos >= 0) { // might be NO_POSITION
                            onStickerSelected(getItem(pos));
                        }
                    }
                });
            }
        }
    }
}

【问题讨论】:

    标签: java android


    【解决方案1】:

    如果您想在应用程序的图库中显示所有可用图像,则不需要。你可以使用

    private Cursor cc = null;
    cc = this.getContentResolver().query(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null,
                    null)
    

    这将为您提供与图库中可用文件的连接。更详细的答案在这里

    How to implement Image Gallery in Gridview in android?

    如果在您的应用程序中有一个图像视图并且您希望您的用户单击图像,然后 Android 应该询问他们是否要从图库/相机中选择图像,您可以按照此操作,您可以调用 selectImage 方法在 ImageView 上的 setOnClickListener 上。

     private void selectImage() {
            final CharSequence[] items = { "Take Photo", "Choose from Library" };
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle("Update Profile Photograph");
            builder.setItems(items, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                    boolean result = Utility.checkPermission(getActivity());
                    if (items[item].equals("Take Photo")) {
                        if(result)
                            cameraIntent();
                    } else if (items[item].equals("Choose from Library")) {
                        if(result)
                            galleryIntent();
                    }
                }
            });
            builder.show();
        }
    private void cameraIntent() {
            Intent takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            File out = Environment.getExternalStorageDirectory();
            out = new File(out, familyMemberId + ".png");
            Uri photoURI = FileProvider.getUriForFile(getContext(), getContext().getPackageName() + ".app.provider", out);
            takePicture.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePicture, 0);
        }
    
        private void galleryIntent() {
            Intent pickPhoto = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(pickPhoto , 1);//one can be replaced with any action code
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
            super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
            switch(requestCode) {
                case 0:
                    if(resultCode == Activity.RESULT_OK){
                        File out = Environment.getExternalStorageDirectory();
                        out = new File(out, familyMemberId + ".png");
                        Uri photoURI = FileProvider.getUriForFile(getContext(), getContext().getPackageName() + ".app.provider", out);
                        Toast.makeText(getContext(), photoURI.toString(), Toast.LENGTH_LONG).show();
                        imageUri =  photoURI.toString();
                        Glide.with(this).load(imageUri).into(familyMemberProfilePick);
                    }
    
                    break;
                case 1:
                    if(resultCode == Activity.RESULT_OK){
                        Uri selectedImage = imageReturnedIntent.getData();
                        imageUri =  selectedImage.toString();
                        Glide.with(this).load(imageUri).into(familyMemberProfilePick);
                    }
                    break;
            }
        }
    

    请不要忘记添加这些

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application ...
    
     <provider
                android:name=".utility.GenericFileProvider"
                android:authorities="${applicationId}.app.provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>
    ....
    </application>
    

    【讨论】:

      猜你喜欢
      • 2021-04-05
      • 2020-02-12
      • 2011-11-30
      • 1970-01-01
      • 2020-05-20
      • 2021-10-13
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多