精华内容
下载资源
问答
  • 主要为大家详细介绍了Android实现选择相册图片显示功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • android选择相册图片显示

    千次阅读 2019-04-02 16:12:45
    参考博文: android打开手机相册获取真正的图片路径 效果展示: 示例代码: MainActivity package com.example.www.mutilmedia; import android.Manifest; import android.app.Activity; import android.c...

    需求描述: 选择手机相册中的一张图片,并通过ImageView展示出来

    参考博文: android打开手机相册获取真正的图片路径

    效果展示:

    示例代码:

    MainActivity

    package com.example.www.mutilmedia;
    
    import android.Manifest;
    import android.app.Activity;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.util.Arrays;
    
    public class MainActivity extends AppCompatActivity {
    
        String[] mPermissionList = new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE};
        public static final int REQUEST_PICK_IMAGE = 11101;
        private ImageView mShowImg;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mShowImg = (ImageView) findViewById(R.id.imageView);
    
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case 100:
                    boolean writeExternalStorage = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                    boolean readExternalStorage = grantResults[1] == PackageManager.PERMISSION_GRANTED;
                    Log.e("MainActivity", Arrays.toString(grantResults));
                    if (grantResults.length > 0 && writeExternalStorage && readExternalStorage) {
                        getImage();
                    } else {
                        Toast.makeText(this, "请设置必要权限", Toast.LENGTH_SHORT).show();
                    }
    
                    break;
            }
        }
    
        private void getImage() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
                startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT).setType("image/*"),
                        REQUEST_PICK_IMAGE);
            } else {
                Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setType("image/*");
                startActivityForResult(intent, REQUEST_PICK_IMAGE);
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK) {
                switch (requestCode) {
                    case REQUEST_PICK_IMAGE:
                        if (data != null) {
                            String realPathFromUri = RealPathFromUriUtils.getRealPathFromUri(this, data.getData());
                            Log.e("MainActivity", realPathFromUri);
                            showImg(realPathFromUri);
                        } else {
                            Toast.makeText(this, "图片损坏,请重新选择", Toast.LENGTH_SHORT).show();
                        }
    
                        break;
                }
            }
        }
    
    
        public void openCamera(View view) {
            ActivityCompat.requestPermissions(MainActivity.this, mPermissionList, 100);
        }
    
    
        public void showImg(String path){
            Bitmap bitmap = BitmapFactory.decodeFile(path);
            mShowImg.setImageBitmap(bitmap);
        }
    
    }
    
    
    • RealPathFromUriUtils
    package com.example.www.mutilmedia;
    
    import android.annotation.SuppressLint;
    import android.content.ContentUris;
    import android.content.Context;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Build;
    import android.provider.DocumentsContract;
    import android.provider.MediaStore;
    
    public class RealPathFromUriUtils {
        /**
         * 根据Uri获取图片的绝对路径
         *
         * @param context 上下文对象
         * @param uri     图片的Uri
         * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
         */
        public static String getRealPathFromUri(Context context, Uri uri) {
            int sdkVersion = Build.VERSION.SDK_INT;
            if (sdkVersion >= 19) { // api >= 19
                return getRealPathFromUriAboveApi19(context, uri);
            } else { // api < 19
                return getRealPathFromUriBelowAPI19(context, uri);
            }
        }
    
        /**
         * 适配api19以下(不包括api19),根据uri获取图片的绝对路径
         *
         * @param context 上下文对象
         * @param uri     图片的Uri
         * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
         */
        private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {
            return getDataColumn(context, uri, null, null);
        }
    
        /**
         * 适配api19及以上,根据uri获取图片的绝对路径
         *
         * @param context 上下文对象
         * @param uri     图片的Uri
         * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null
         */
        @SuppressLint("NewApi")
        private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {
            String filePath = null;
            if (DocumentsContract.isDocumentUri(context, uri)) {
                // 如果是document类型的 uri, 则通过document id来进行处理
                String documentId = DocumentsContract.getDocumentId(uri);
                if (isMediaDocument(uri)) { // MediaProvider
                    // 使用':'分割
                    String id = documentId.split(":")[1];
    
                    String selection = MediaStore.Images.Media._ID + "=?";
                    String[] selectionArgs = {id};
                    filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);
                } else if (isDownloadsDocument(uri)) { // DownloadsProvider
                    Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));
                    filePath = getDataColumn(context, contentUri, null, null);
                }
            } else if ("content".equalsIgnoreCase(uri.getScheme())) {
                // 如果是 content 类型的 Uri
                filePath = getDataColumn(context, uri, null, null);
            } else if ("file".equals(uri.getScheme())) {
                // 如果是 file 类型的 Uri,直接获取图片对应的路径
                filePath = uri.getPath();
            }
            return filePath;
        }
    
        /**
         * 获取数据库表中的 _data 列,即返回Uri对应的文件路径
         *
         * @return
         */
        private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
            String path = null;
    
            String[] projection = new String[]{MediaStore.Images.Media.DATA};
            Cursor cursor = null;
            try {
                cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
                if (cursor != null && cursor.moveToFirst()) {
                    int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
                    path = cursor.getString(columnIndex);
                }
            } catch (Exception e) {
                if (cursor != null) {
                    cursor.close();
                }
            }
            return path;
        }
    
        /**
         * @param uri the Uri to check
         * @return Whether the Uri authority is MediaProvider
         */
        private static boolean isMediaDocument(Uri uri) {
            return "com.android.providers.media.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri the Uri to check
         * @return Whether the Uri authority is DownloadsProvider
         */
        private static boolean isDownloadsDocument(Uri uri) {
            return "com.android.providers.downloads.documents".equals(uri.getAuthority());
        }
    }
    
    
    • activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/button3"
            app:srcCompat="@android:color/white" />
    
        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="16dp"
            android:layout_marginEnd="8dp"
            android:onClick="openCamera"
            android:text="camera"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.048"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </android.support.constraint.ConstraintLayout>
    
    • AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.www.mutilmedia">
    
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
    展开全文
  • Android相机、相册获取图片显示并保存源码
  • 本篇博客是自己在学习Android开发工程中实现一个小demo,主要实现Android App中从相册中选择获取,并且显示,但是这里并没有做相应的裁剪,直接显示。 首先是Android的布局layout文件activity_main.xml文件,比较...

      本篇博客是自己在学习Android开发工程中实现一个小demo,主要实现Android App中从相册中选择获取,并且显示,但是这里并没有做相应的裁剪,直接显示。

    首先是Android的布局layout文件activity_main.xml文件,比较简单,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center">
    
        <Button
            android:id="@+id/choose_pic"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="选择图片" />
    
        <ImageView
            android:id="@+id/picture_set"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"/>
    
    </LinearLayout>

     效果如下:

     接下来是图片选择的事件,代码如下:

        private Button chooseButton;
        private ImageView imageView;
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            Log.d("ImagePicker", "onCreate: ");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            imageView = findViewById(R.id.picture_set);
            chooseButton = findViewById(R.id.choose_pic);
            chooseButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    selectPicture();
                }
            });
        }
    
    
        /**
         * 从相冊选择照片(不裁切)
         */
        private void selectPicture() {
            Intent intent=new Intent();
            intent.setAction(Intent.ACTION_PICK);//Pick an item from the data
            intent.setType("image/*");//从全部图片中进行选择
            startActivityForResult(Intent.createChooser(intent, "Complete action using"), 1);
        }

     然后实现图片选择并回显的功能,代码如下:

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode == RESULT_OK && requestCode == 1 && null != data) {
                decodeUri(data.getData());
            }
            super.onActivityResult(requestCode, resultCode, data);
        }
    
        public void decodeUri(Uri uri) {
            ParcelFileDescriptor parcelFD = null;
            try {
                parcelFD = getContentResolver().openFileDescriptor(uri, "r");
                FileDescriptor imageSource = parcelFD.getFileDescriptor();
    
                // Decode image size
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                BitmapFactory.decodeFileDescriptor(imageSource, null, o);
    
                // the new size we want to scale to
                final int REQUIRED_SIZE = 1024;
    
                // Find the correct scale value. It should be the power of 2.
                int width_tmp = o.outWidth, height_tmp = o.outHeight;
                int scale = 1;
                while (true) {
                    if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) {
                        break;
                    }
                    width_tmp /= 2;
                    height_tmp /= 2;
                    scale *= 2;
                }
    
                // decode with inSampleSize
                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                Bitmap bitmap = BitmapFactory.decodeFileDescriptor(imageSource, null, o2);
    
                imageView.setImageBitmap(bitmap);
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }finally {
                if (parcelFD != null)
                    try {
                        parcelFD.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }

     decodeUri处理getData()得到的Uri,并显示。

    demo完整的效果演示如下:

    点击选择图片按钮:

     点击图片,显示结果:

     

    展开全文
  • 主要介绍了Android 图片存入系统相册更新显示实例详解的相关资料,需要的朋友可以参考下
  • Android相机、相册获取图片显示并保存

    千次下载 热门讨论 2013-03-09 14:44:36
    实现从相机拍照和相册选取图片显示并保存到本地SD卡操作Demo,避免了Bitmap导致的内存溢出
  • 主要介绍了Android相册中选择照片并返回功能,需要的朋友可以参考下
  • 支持Android 拍照显示图片并更新媒体库,选中相册图片显示
  • android 相册图片多选

    2013-11-29 15:57:40
    android 相册图片多选-模仿微信朋友圈发帖的功能,功能和微信一致,相册图片多选显示删除等
  • Android 图片存入系统相册更新显示实例详解在开发android的过程中,我们避免不了可能会涉及到做一个自定义相册或则会去本地创建一个文件夹来存储我们需要的图片。拿相册来说,比如我们创建一个test的文件夹,拍完...

    Android 图片存入系统相册更新显示实例详解

    在开发android的过程中,我们避免不了可能会涉及到做一个自定义相册或则会去本地创建一个文件夹来存储我们需要的图片。拿相册来说,比如我们创建一个test的文件夹,拍完一张照片后存储到这个指定的test文件夹里,然后在相册里面显示出来,就像微信的效果一样。拍完即可立即显示。但是,在实际开发过程中我们保存完一张图片后并不能立即更新显示出来这个图片,需要我们重启手机才能在系统相册中显示出来。

    这里先提供一个插入系统图库的方法:

    MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "", "");

    通过该方法即可把图片插入到系统图库中。但是,插入后并不会立即显示出来,需要发送一个广播:sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

    来通知系统进行整个sd卡的扫描,如果sd里面的东西越多就会扫描的越久,并且扫描中我们不能访问sd卡,所以这样的实现方式对用户来说并不友好。

    这里我们可以使用系统api:MediaScannerConnection给我们的方法来进行扫描更新:

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    mHandler.sendEmptyMessageDelayed(1, 2000);

    mConnection =new MediaScannerConnection(mContext,this);

    }

    @Override

    public void onMediaScannerConnected() {

    mConnection.scanFile("/sdcard/image.jpg", "image/jpeg");

    }

    @Override

    public void onScanCompleted(String s, Uri uri) {

    Log.v("huan", "scan completed");

    mConnection.disconnect();

    }

    但是该种方法我在使用过程中发现一个问题就是:传入的context会被MediaScannerConnection一直持有,导致oom。所以在使用过程中在activity使用时还需要注意。

    另外我们还可以通过指定路径的方式来进行广播,这样就可以避免扫描整个sd卡:

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory() + picPath)));

    图片更新的技巧和注意事项分享给大家,希望对你有帮助。

    时间: 2017-06-28

    展开全文
  • Android 本地图片显示相册或隐藏

    千次阅读 2018-12-05 11:31:21
    隐藏: 1、创建 .nomedia 文件夹,则该文件夹被隐藏,但在代码中依然可以获取到文件 2、在文件夹里面新增.nomedia文件,则文件夹下系统会自动跳过扫描文件,从而隐藏 显示: ... // 首先保存图片...

    隐藏:

    1、创建 .nomedia 文件夹,则该文件夹被隐藏,但在代码中依然可以获取到文件

    2、在文件夹里面新增.nomedia文件,则文件夹下系统会自动跳过扫描文件,从而隐藏

     

    显示:

    插入相册- > 通知图库

    public static void saveImageToGallery(Context context, Bitmap bmp) {
        // 首先保存图片
        File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(appDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            bmp.compress(CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
    	}
        
        // 其次把文件插入到系统图库
        try {
            MediaStore.Images.Media.insertImage(context.getContentResolver(),
    				file.getAbsolutePath(), fileName, null);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 最后通知图库更新
        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));

     

    展开全文
  • <?xml version="1.0" encoding="utf-8"?> ...paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path="" /> </paths>
  • 主要为大家详细介绍了Android实现保存图片到本地并在相册显示的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Android图片下载显示相册效果),自己开发用到,没研究完,只是个半成品,记录一下
  • Android相册中选择图片显示出来

    千次阅读 2017-02-25 15:51:59
    下面的两篇博客我是选择其中的一部分使用的。大家可以自己试试。...一、选择图片 定义Intent跳转到特定图库的Uri下挑选,然后将挑选结果返回给Activity 用到startActivityForResult [java] 
  • android 拍完照片后,让图片隐藏,不显示相册中,怎么做到??
  • Android 调用系统相册选择图片显示

    万次阅读 多人点赞 2016-08-01 14:11:10
    主要代码:package wkk...import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.n
  • demo为仿微信朋友圈发动态的功能,实现从相机拍照和相册相册为自己实现且支持同时选取多张图片)选取图片显示和删除并保存到本地SD卡操作(保存到本地的是高清的压缩图片小于100KB 分辨率1280*720 可以直接上传到...
  • 图片多选,可设置最大选择数,支持浏览模式,可选可编辑模式,是否显示图片备注。支持拍照,本地相册。做选择图片上传到服务器的不要错过,非常不错的代码,还有动画效果。
  • 1、说明 我们有时候需要将网络上的图片保存到手机方便之后查看,但是...So,Android提供这样一个机制:如果你想让这张图片相册显示显示发送一个广播,并告诉系统你要将这张图片添加到媒体库,以下是这条广播...
  • 仿QQ照片选择器,使用ContentProvider读取SD卡所有图片。支持按照父目录分类显示,多选添加。
  • Android手机相册

    热门讨论 2011-09-21 22:38:15
    开发一个Android 平台下手机相册软件。 备注:可以拍摄、编辑、查看、分享本地相册以及网络相册。 1开发平台Android,能够自动适应320X200 及800X480分辨率手机 2提供关于页面,显示文本模式版权信息 3以启动摄像头...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,170
精华内容 5,268
关键字:

android显示相册图片