获取本地图片,并保存到bean

本文详细介绍了在Android应用中如何实现从本地选择图片并显示在ImageView上的过程,包括使用Intent跳转到本地图片选择界面,获取选中图片的路径,以及通过Glide库加载图片。

获取本地图片,并建立

1.点击跳转到本地图片

case R.id.iv_wish_bg:
                Intent intent = new Intent();
                /* 开启Pictures画面Type设定为image */
                intent.setType("image/*");
                /* 使用Intent.ACTION_GET_CONTENT这个Action */
                intent.setAction(Intent.ACTION_GET_CONTENT);
                /* 取得相片后返回本画面 */
                startActivityForResult(intent, 1);
                break;

2.保存路径,并建立

 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (resultCode == RESULT_OK) {
            Uri uri = data.getData();
            //这是本机的图片路径
           img_url= UrlUtils.getPathByUri4kitkat(WishSettingActivity.this,uri);
            etWishBg.setText("1");
            ContentResolver cr = this.getContentResolver();//内容解析器
            try {
                Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));//打开输出流
                ImageView imageView = (ImageView) findViewById(R.id.iv_wish_bg);
                /* 将Bitmap设定到ImageView */
                imageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                Log.e("Exception", e.getMessage(),e);
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

3.getPathByUri4kitkat()方法

 @SuppressLint("NewApi")

    public static String getPathByUri4kitkat(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider文件提供者

        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

            if (isExternalStorageDocument(uri)) {// ExternalStorageProvider

                final String docId = DocumentsContract.getDocumentId(uri);

                final String[] split = docId.split(":");

                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {

                    return Environment.getExternalStorageDirectory() + "/" + split[1];

                }

            } else if (isDownloadsDocument(uri)) {// DownloadsProvider

                final String id = DocumentsContract.getDocumentId(uri);

                final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),

                        Long.valueOf(id));

                return getDataColumn(context, contentUri, null, null);

            } else if (isMediaDocument(uri)) {// MediaProvider

                final String docId = DocumentsContract.getDocumentId(uri);

                final String[] split = docId.split(":");

                final String type = split[0];

                Uri contentUri = null;

                if ("image".equals(type)) {

                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

                } else if ("video".equals(type)) {

                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

                } else if ("audio".equals(type)) {

                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

                }

                final String selection = "_id=?";

                final String[] selectionArgs = new String[] { split[1] };

                return getDataColumn(context, contentUri, selection, selectionArgs);

            }

        } else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore

            // (and

            // general)

            return getDataColumn(context, uri, null, null);

        } else if ("file".equalsIgnoreCase(uri.getScheme())) {// File

            return uri.getPath();

        }

        return null;

    }



    /**

     * Get the value of the data column for this Uri. This is useful for

     * MediaStore Uris, and other file-based ContentProviders.

     *

     * @param context

     *            The context.

     * @param uri

     *            The Uri to query.

     * @param selection

     *            (Optional) Filter used in the query.

     * @param selectionArgs

     *            (Optional) Selection arguments used in the query.

     * @return The value of the _data column, which is typically a file path.

     */

    public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {

        Cursor cursor = null;

        final String column = "_data";

        final String[] projection = { column };

        try {

            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);

            if (cursor != null && cursor.moveToFirst()) {

                final int column_index = cursor.getColumnIndexOrThrow(column);

                return cursor.getString(column_index);

            }

        } finally {

            if (cursor != null)

                cursor.close();

        }

        return null;

    }



    /**

     * @param uri

     *            The Uri to check.

     * @return Whether the Uri authority is ExternalStorageProvider.

     */

    public static boolean isExternalStorageDocument(Uri uri) {

        return "com.android.externalstorage.documents".equals(uri.getAuthority());

    }



    /**

     * @param uri

     *            The Uri to check.

     * @return Whether the Uri authority is DownloadsProvider.

     */

    public static boolean isDownloadsDocument(Uri uri) {

        return "com.android.providers.downloads.documents".equals(uri.getAuthority());

    }



    /**

     * @param uri

     *            The Uri to check.

     * @return Whether the Uri authority is MediaProvider.

     */

    public static boolean isMediaDocument(Uri uri) {

        return "com.android.providers.media.documents".equals(uri.getAuthority());

    }

4.拿出来使用

if (img_url!=null){
                Glide.with(WishShowActivity.this).load(img_url).into(ivBg);
            }
本地图片路径保存到数据库,读取后无法在浏览器访问图片,可能是由于浏览器的安全机制、路径问题、权限问题等导致的。以下是一些解决办法: ### 1. 使用相对路径或网络路径 浏览器出于安全考虑,通常不允许直接访问本地文件系统的绝对路径。可以将图片上传到服务器的某个目录,然后在数据库中保存图片的相对路径或完整的网络路径。 例如,将图片上传到服务器的 `uploads` 目录,数据库中保存的路径为 `uploads/image1.jpg`。在 HTML 中使用相对路径显示图片: ```html <img src="uploads/image1.jpg" alt="图片"> ``` ### 2. 通过服务器端脚本处理 使用服务器端脚本(如 PHP、Java 等)来读取本地图片返回给浏览器。以 Java 为例,以下是一个简单的示例: #### 前台代码 ```html <!-- 假设请求后台的地址为 /getpicture/toFindImg --> <img src="/getpicture/toFindImg?imgUrl=uploads/image1.jpg" alt="图片"> ``` #### 后台 Java 代码(使用 Spring Boot 示例) ```java import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.http.HttpServletResponse; @RestController public class PictureController { @GetMapping("/getpicture/toFindImg") public void toFindImg(@RequestParam("imgUrl") String imgUrl, HttpServletResponse response) throws IOException { // 构建图片的完整路径 String fullPath = "uploads/" + imgUrl; File file = new File(fullPath); if (file.exists()) { // 设置响应的内容类型 response.setContentType(MediaType.IMAGE_JPEG_VALUE); // 获取输出流 OutputStream out = response.getOutputStream(); FileInputStream in = new FileInputStream(file); // 读取文件写入输出流 byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } // 关闭流 in.close(); out.flush(); out.close(); } else { // 图片不存在,返回 404 错误 response.sendError(HttpServletResponse.SC_NOT_FOUND); } } } ``` ### 3. 检查文件权限 确保服务器有足够的权限访问图片文件。如果是 Linux 系统,可以使用 `chmod` 命令修改文件或目录的权限。 ```bash chmod 644 uploads/image1.jpg ``` ### 4. 跨域问题 如果图片的访问涉及跨域,需要在服务器端配置 CORS(跨域资源共享)。以 Spring Boot 为例,可以在配置类中添加以下代码: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOriginPattern("*"); // 允许所有域名进行跨域调用 config.addAllowedHeader("*"); // 允许任何请求头 config.addAllowedMethod("*"); // 允许任何方法(POST、GET等) config.setAllowCredentials(true); // 允许携带凭证 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); // 对所有接口都有效 return new CorsFilter(source); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值