精华内容
下载资源
问答
  • 简单叙述下----踩坑场景...但是你会发现图片不显示或者刷新才能显示。 原因: 当A界面(Activity或者Fragment)去相册或者拍照,然后拿到照片返回A界面这个过程,A界面生命周期会经历以下变化: onStop->onS...

    简单叙述下----踩坑场景:

            用户中心界面(假设为A界面):有一个圆形头像,当前头像状态为用户还未设置或者前一次Glide加载失败而设置的占位图。接下来通过拍照或者本地相册裁剪后,将图片通过onActivityResult回传到A界面,然后上传到服务器。如果上传成功,就setImageBitmap到头像照。但是你会发现图片不显示或者刷新后才能显示。


    原因:

            当A界面(Activity或者Fragment) 去相册或者拍照,然后拿到照片返回A界面这个过程,A界面生命周期会经历以下变化:   onStop-> onActivityResult-> onStart -> onResume.

    当选中的图片信息被回传到onActivityResult后,setImageBitmap这张图片到头像中()。然后A界面的onStart被触发。

    由于当前头像状态为用户还未设置或者前一次Glide加载失败而设置的占位图,所以前一次Glide中图片请求状态值为失败

            而Glide框架会监听了当前页面(Activity或者Fragment)的生命周期。A界面onStop时,Glide将调用pauseRequests暂停所有running请求。A界面onStart时,Glide会重新启动除完成、取消、真正running以外的所用请求。这会让失败的请求会重新再请求一遍-----还是失败。所以Glide 又会给头像设置占位图,导致setImageBitmap的头像图片被覆盖了。


    下面源码分析:

    下面的类为Glide:3.7.0中的

    GenericRequestBuilder: 添加生命周期监听

    RequestManager:onStart

    RequestTracker:

    GenericRequest:

    后面分析参考:https://blog.csdn.net/silently_frog/article/details/100514515


    解决方法:

            1.  取消该图片在glide中的请求,再setImageBitmap

                 Glide.clear(logo);

                 logo.setImageBitmap(photo);

            2.  由于所有请求被存放在Set中,所以再给该图片设置一个Glide请求。将前一个Glide去掉。

                 Glide.with(this) .load(FileUtilUp.bitmapToBytes(photo));

    RequestTracker:

                 

     

    展开全文
  • 一、问题:我的app调用系统拍照功能,然后使用知乎的Matisse框架加载自己定义的文件夹中的图片,发现怎么也不显示。 二、原因:Android给图片创建了一个数据库,我们需要手动去刷新这个数据库,把刚刚拍摄的照片...

    一、问题:我的app调用系统拍照功能,然后使用知乎的Matisse框架加载自己定义的文件夹中的图片,发现怎么也不显示。

    二、原因:Android给图片创建了一个数据库,我们需要手动去刷新这个数据库,把刚刚拍摄的照片信息放到数据库中,其它的软件才可以获取到图片。否则只有自己找到那个路径去拿图片了。

    三、先看实现:

    package com.ysl.photo;
    
    import android.Manifest;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.text.TextUtils;
    
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.content.FileProvider;
    
    import com.tbruyelle.rxpermissions2.RxPermissions;
    import com.ysl.myandroidbase.R;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
    
    import io.reactivex.disposables.Disposable;
    
    public class TakePhotoActivity extends AppCompatActivity {
        private String path;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_takephoto);
            Disposable subscribe = new RxPermissions(this).request(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    .subscribe(aBoolean -> {
                        if (aBoolean) {
                            findViewById(R.id.take_photo).setOnClickListener(v -> takePhoto());
                        } else {
                        }
                    });
        }
    
        private void takePhoto() {
            Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File file = new File(getPictureDirPath().getAbsolutePath(),
                    System.currentTimeMillis() + ".jpg");
            path = file.getAbsolutePath();
            Uri imageUri = FileProvider.getUriForFile(getApplicationContext(),
                    "com.ysl.myandroidbase.fileprovider", file);
            System.out.println("-------->"+imageUri);
            //-------->content://com.ysl.myandroidbase.fileprovider/m/MyAndroidBase/mybase/1574394370534.jpg
            System.out.println("-------->"+path);
            //-------->/storage/emulated/0/MyAndroidBase/mybase/1574394370534.jpg
            openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            openCameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                List<ResolveInfo> resInfoList = getApplicationContext().getPackageManager()
                        .queryIntentActivities(openCameraIntent, PackageManager.MATCH_DEFAULT_ONLY);
                for (ResolveInfo resolveInfo : resInfoList) {
                    String packageName = resolveInfo.activityInfo.packageName;
                    getApplicationContext().grantUriPermission(packageName, imageUri,
                            Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                                    | Intent.FLAG_GRANT_READ_URI_PERMISSION);
                }
            }
            TakePhotoActivity.this.startActivityForResult(openCameraIntent, 0);
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case 0:
                    if (!TextUtils.isEmpty(path) && resultCode == -1) {
                        Bitmap mBitmap = BitmapFactory.decodeFile(path);
                        saveBitmapFile(mBitmap);
                    }
                    break;
                default:
                    break;
            }
        }
    
        /**
         * 保存图片并发送广播通知数据库刷新,只有这样才能在相册里面看到这张照片
         * @param bitmap
         */
        public void saveBitmapFile(Bitmap bitmap){
            //将要保存图片的路径
            File file = new File(path);
            try {
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                bos.flush();
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            //发送广播给系统,刷新数据库
            Uri uri = Uri.fromFile(file);
            System.out.println("imageUri------>"+uri);
            //imageUri------>file:///storage/emulated/0/MyAndroidBase/mybase/1574394370534.jpg
            Intent localIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
            sendBroadcast(localIntent);
    
    
            //下面这种扫描的方法也可以刷新数据库
            new SingleMediaScanner(this.getApplicationContext(),
                    getPictureDirPath().getAbsolutePath(),
                    new SingleMediaScanner.ScanListener() {
                        @Override public void onScanFinish() {
                            Log.i("SingleMediaScanner", "scan finish!");
                        }
                    });
        }
        public static File getPictureDirPath() {
            File mIVMSFolder = null;
            try {
                String path = Environment.getExternalStorageDirectory().getAbsolutePath()
                        + File.separator + "MyAndroidBase" + File.separator + "mybase";
                mIVMSFolder = new File(path);
                if (!mIVMSFolder.exists()) {
                    mIVMSFolder.mkdirs();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return mIVMSFolder;
        }
    }
    

    以上就是核心代码:

    调用相机时:

    Uri imageUri = FileProvider.getUriForFile(getApplicationContext(),
            "com.ysl.myandroidbase.fileprovider", file);

    使用这种方式来获取uri,因为使用文件的方法在高版本Android下报错;其中的第二个参数怎么来的:

    在清单文件中:

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.ysl.myandroidbase.fileprovider"
        android:exported="false"<!--exported:必须是false-->
        android:grantUriPermissions="true"><!--grantUriPermissions:必须是true,表示授予 URI 临时访问权限-->   
     <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths_public"></meta-data>
    </provider>
    <!--resource:中的@xml/file_paths是我们接下来要添加的文件-->
    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path
            name="m" <!--会被应用在uri中,下面打印的uri可以看到-->
            path="."/><!--会被应用在图片的保存路径中, 这里只用一个点,表示不改变之前自定义的路径-->
    </paths>

     

    看看打印的uri:

    content://com.ysl.myandroidbase.fileprovider/m/MyAndroidBase/mybase/1574394370534.jpg

    方便和后面对比;

    在activity跳转回调中:

    要保存图片并发送更新系统数据库的广播:

    //发送广播给系统,刷新数据库
    Uri uri = Uri.fromFile(file);
    System.out.println("imageUri------>"+uri);
    //imageUri------>file:///storage/emulated/0/MyAndroidBase/mybase/1574394370534.jpg
    Intent localIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
    sendBroadcast(localIntent);

    这段代码就可以让相册发现刚刚拍摄的照片了;

    注意这里一个坑:看这里获取的uri方法:Uri uri = Uri.fromFile(file);  再看打印的uri,是以file://+路径的方式。

    file:///storage/emulated/0/MyAndroidBase/mybase/1574394370534.jpg

    我们再看上面的uri:content://com.ysl.myandroidbase.fileprovider/m/MyAndroidBase/mybase/1574394370534.jpg

    这两个是不一样的;我之前就是因为发送广播时使用了上面的uri,导致怎么都不起作用;后来才发现,这里已经存好文件了,就使用Uri.fromFile(file)来获取uri。

    再往下看:

    //下面这种扫描的方法也可以刷新数据库
    new SingleMediaScanner(this.getApplicationContext(),
            getPictureDirPath().getAbsolutePath(),
            new SingleMediaScanner.ScanListener() {
                @Override public void onScanFinish() {
                    Log.i("SingleMediaScanner", "scan finish!");
                }
            });

    这段代码也能实现刷新数据库的功能,主要是引入一个实现MediaScannerConnection.MediaScannerConnectionClient的类:

    package com.ysl.photo;
    
    import android.content.Context;
    import android.media.MediaScannerConnection;
    import android.net.Uri;
    
    /**
     * description:媒体扫描
     */
    public class SingleMediaScanner implements MediaScannerConnection.MediaScannerConnectionClient {
    
        private MediaScannerConnection mMsc;
        private String mPath;
        private ScanListener mListener;
    
        public interface ScanListener {
    
            /**
             * scan finish
             */
            void onScanFinish();
        }
    
        public SingleMediaScanner(Context context, String mPath, ScanListener mListener) {
            this.mPath = mPath;
            this.mListener = mListener;
            this.mMsc = new MediaScannerConnection(context, this);
            this.mMsc.connect();
        }
    
        @Override public void onMediaScannerConnected() {
            mMsc.scanFile(mPath, null);
        }
    
        @Override public void onScanCompleted(String mPath, Uri mUri) {
            mMsc.disconnect();
            if (mListener != null) {
                mListener.onScanFinish();
            }
        }
    }
    

    可以看到,他是Android的media库中的一个接口,然后在连接上之后,调用扫描文件的方法,扫描指定的路径下的文件。这样图片也就被扫描出来了。

     

     

    展开全文
  • 我在程序中调用了摄像头拍照和从相册中选择照片,在主程序中点takePhoto按钮依次调用摄像机和剪裁程序,最后在主程序中显示照片。在主程序中点Choose From Album按钮则只显示查找手机中的图片,选中能剪裁也...
  • 学习《第一行代码》关于调用相机拍照的时候我出现了一个问题:刚刚拍完的照片...这是因为刚插入的图片还没有更新的缘故,故要让系统相册知道我们刚插入的照片。 //书上的拍照代码... //添加的代码如下 Intent in...

    首先感谢https://blog.csdn.net/xiaanming/article/details/8990627这篇文章给我带来的帮助。

    学习《第一行代码》关于调用相机拍照的时候我出现了一个问题:刚刚拍完的照片在之后的选取照片的时候并不会出现。这是因为刚插入的图片还没有更新的缘故,故要让系统相册知道我们刚插入的照片。

    //书上的拍照代码...
    
    //添加的代码如下
        Intent intent = new Intent(); 
        Uri uri = Uri.fromFile(outputImage);   
        intent.setAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); //表示要将数据添加进系统的媒体资源库
        intent.setData(uri); //将照片文件的地址存入数据库
        sendBroadcast(intent); 
    

    问题解决。

    展开全文
  • 问题描述拍照后显示缩略图没有问题,但是选择显示原图程序就崩溃了,抛出一个FileUriExposedException 异常.问题原因《第一行代码》(第二版)的第八章里的 “调用摄像头和相册”小节讲到了这个问题: 从Android 7.0...

    问题描述

    拍照后显示缩略图没有问题,但是选择显示原图程序就崩溃了,抛出一个FileUriExposedException 异常.

    问题原因

    《第一行代码》(第二版)的第八章里的 “调用摄像头和相册”小节讲到了这个问题:

    Android 7.0系统开始,直接使用本地真实路径的Uri被认为是不安全的,会抛出一个FileUriExposedException异常。

    解决办法

    使用FileProvider

    FileProvider是一种特殊的内容提供器,它使用了和内容提供器类似的机制来对数据进行保护,可以选择性地将封装过的Uri共享给外部,从而提高了应用的安全性。

    代码片段

    // 创建File对象,用于存储拍照后的图片
    File outputImage = new File(getExternalCacheDir(),
        "output_image.jpg");
    //判断当前Android版本号是否大于等于24
    if (Build.VERSION.SDK_INT >= 24){   
        //如果是则使用FileProvider
        imageUri = FileProvider.getUriForFile(MainActivity.this,
            "com.example.cameraalbum.fileprovider", outputImage);
    } else {    
        //否则,使用原来的fromFile()
        imageUri = Uri.fromFile(outputImage);
    }

    其中,getUriForFile方法接受三个参数:
    第一个参数要求传入Context对象,
    第二个参数可以是任意唯一的字符串,
    第三个参数则是之前创建的File对象。

    此外,还要在AndroidManifest.xml中对内容提供器进行注册:

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.example.camearalbum.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
             android:name="android.support.FILE_PROVIDER_PATHS"
             android:resource="@xml/file_paths"/>
    </provider>

    其中,android:name 属性的值是固定的,android:authoritirs 属性的值必须要和FileProvider.getUriForFile() 方法中的第二个参数一致。
    另外,这里还在<provider>标签的内部使用<meta-data>来指定Uri的共享路径,并引用了一个@xml/file_paths资源。

    res目录下新建一个xml目录然后新建一个file_paths.xml文件,并修改文件中的内容:

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

    其中,external-path就是用来指定Uri共享的,name属性的值可以随便填,path属性的值表示共享的具体路径。这里设定空就表示将整个SD卡进行共享,也可以仅共享存放output_image.jpg 这张图片的路径。

    还有一点需要注意,在Android 4.4系统之前,访问SD卡的应用关联目录也是要声明权限的,从4.4系统开始不在需要权限声明。
    为了兼容老版本系统,还需要在AndroidManifest.xml 中声明一下SD卡的权限:

    <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    以上就可以解决Android 7.0直接使用本地真实路径的Uri会抛出FileExposedExceptiond 异常的问题了。

    最后附上源码:GitHub


    End

    展开全文
  • 点击一个div 我用mintui的Actionsheet 显示选择拍照或者从相册中选择。选择之后 调用hbuilder的 plus.gallery.pick或者 plus.camera.getCamera 然后拿到了src的值 现在就是知道怎样才能把这个url以FormData的形式...
  • 发出一条通知,手机最上方的状态栏会显示一个通知的图标,下拉状态栏可以看到通知的详细内容。Android的通知功能获得了大量用户的认可和喜爱,就连IOS系统也在5.0版本之后加入了类似的功能。 通知的基本用法 ...
  • 获取android的拍照和自定义多选相册

    千次阅读 热门讨论 2016-12-06 09:51:11
    获取系统的相机功能拍照这个难,但是需要注意的是,拍照返回照片如果没有指定存储的路径,那么系统将自动保存到sd卡中,得到的是拍完照的缩略图,会失帧,显示有些模糊,所以在调用系统相机拍完照我们要指定...
  • http://blog.csdn.net/xiaanming/article/details/8990627 (解决Android拍照保存在系统相册不显示的问题) 刚开始的时候,我按照上文的办法试了一下,发现在android 4.0.3 AVD模拟器中是可以在系统相册中查看照片的...
  • GPS照片定位显示软件

    2020-05-12 11:29:32
    一个相册地图程序,可以利用照片拍摄时记录的经纬度信息,在地图上显示照片位置,还可以对照片定位信息进行修改。对于带定位信息的jpg图片,也可以注入定位信息。所有功能仅需图片文件本身,无需任何辅助信息或...
  • geoPics.exe, 一个相册地图程序,可以利用照片拍摄时记录的经纬度信息,在地图上显示照片位置,还可以对照片定位信息进行修改。对于带定位信息的jpg图片,也可以注入定位信息。所有功能仅需图片文件本身,无需任何...
  • 在申请了android.permission.WRITE_EXTERNAL_STORAGE权限,从相册里选择的图片还是一直能加载到ImageView中,通过对整个代码部分可能有问题的地方都加了log、Toast进行检查,是没问题的,能一路顺畅地运行到最后...
  • // 下面这句指定调用相机拍照后照片存储的路径 if (!PHOTO_DIR.exists()) { boolean iscreat = PHOTO_DIR.mkdirs();// 创建照片的存储目录 } tempFile = new File(PHOTO_DIR, ...
  • 另外一个按钮是打开相册,选取照片后剪裁图片之后再显示在imageview中。 但实际中出现问题: 1.第一个按钮在剪裁之后没有在imageview中显示。(但确定是已经执行了onActivityResult()方法中的显示imageview的方法...
  • 您的Google相册-注意:支持共享相册 Chromecast使用的一些背景照片 500px以上的数个流 来自reddit的几个来源 来自Flickr的有趣照片 注意:支持本地文件系统中的照片。 许多选项可用于控制幻灯片的外观,包括:...
  • 20.公共相册显示区,显示每个用户共享给所有人的相册照片并可进行显示及评论。 21.用户可按等级权限自由绑定顶级域名代替外部空间地址,空间地址个性化。 22.界面样式自定义并可由用户在前台选择喜爱的空间风格。 ...
  • 桃源相册管理系统v2.3

    2014-07-15 17:27:29
    20.公共相册显示区,显示每个用户共享给所有人的相册照片并可进行显示及评论。 21.用户可按等级权限自由绑定顶级域名代替外部空间地址,空间地址个性化。 22.界面样式自定义并可由用户在前台选择喜爱的空间风格。 ...
  • 1.拍照后获取图片(系统为了防止应用内存占用过大,对于在应用内通过相机拍摄的图片最终返回来的结果进行了压缩,压缩后的图片变得很小,通过getData的方式只能满足比如显示个头像这样的需求,如果要显示大图,就会...
  • 20.公共相册显示区,显示每个用户共享给所有人的相册照片并可进行显示及评论。 21.用户可按等级权限自由绑定顶级域名代替外部空间地址,空间地址个性化。 22.界面样式自定义并可由用户在前台选择喜爱的空间风格。 ...
  • onActivityResult能收到setResult(RESULT_OK, intent);的回调。解决这个问题时被坑了两个...项目中用到了取相册照片或者是拍照后传回照片,并显示。在我手机上跑的好好的,结果在同事手机上死活不行,当时就想到是
  • 关联文章 从0到1打造一款react-native App(一)环境配置从0到1打造一款react-native App(二)Navigation+Redux ...拍照的主要需求是在拍照后照片在系统相册显示出来,android拍照后会默认存储...
  • Q:拍照后照片保存失败 A:请参考issue481:https://github.com/banchichen/TZImagePickerController/issues/481 的信息排查,若还有问题请直接在issue内评论 Q:photos数组图片不是原图,如何获取原图? A:请参考...
  • 这个app有一个问题,在相册没有照片时,会显示一个去拍照的按钮让用户去拍照,然后拍完返回就会显示在列表里,这个坑就在这里,我调用系统相机拍照返回,查找到这个相片,onActivityResult返回的Intent也是null...
  • android调用照相机拿到原图

    千次阅读 2015-03-17 18:03:26
    转自:原地址 本文主要讲解的是保存拍照后的图片到系统默认文件夹下,并在...4、刷新系统相册,解决图库能立刻显示最新照片的问题; 5、图片裁剪; 6、图片大小及尺寸调整。随着《证件照片助手》http://www.eoema
  • Android代码-图像识别

    2019-08-06 07:27:26
    Card NJUCS 2014 创新实验——安卓开发,图像识别 ...联系人界面在拍照得到大尺寸图片无法显示联系人信息 注意: 任务范围外的代码文件,布局文件尽量不要修改,避免Merge时的冲突 不要私自删除文件
  • nonbootstrapvisitor-源码

    2021-05-10 04:44:21
    此演示使用设备API和文件API来使用浏览器在手机上拍照显示图片。 观看。 在您的Android手机上尝试一下 。 在阅读David Calhoun的有关的帖子,我编写了此演示。 这可以在运行“冰淇淋三明治”(4.0.4)的...
  • 功能优化:相册界面打开相机,拍照后不直接返回,而是默认选中拍完的图片,停留在相册界面 字段增加:具体查看11-多语言 重要修改:Photo对象去除isCamera成员变量。构造函数也因此相应改变,少了一个参数。 重要...
  • 3. 新增图片放大以像素模式浏览的显示效果(推荐设计师使用) 4. 管理窗口左侧文件夹目录右键新增“新建文件夹”功能 5. 穿透文件夹允许同时删除不同文件夹中的图片 6. 调整看图窗口适应窗口时的显示细节 7. ...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

拍照后相册不显示照片