Android 7.0 之 FileProvider运用:拍照获取头像并设置

Android 7.0 之 FileProvider运用:拍照获取头像并设置,第1张

概述  FileProvider是android7.0之后才有的一个东西,其目的也是加强管理碎片化严重的android文件夹,避免其内的应用随意使用手机的内存。  使用一个例子来具体实 *** 一下,拍照获取图片,并设置到ImageView中:  把大象放到冰箱需要几个步骤?  步骤一:打开相机://相机

    fileProvIDer 是androID 7.0 之后才有的一个东西,其目的也是加强管理碎片化严重的androID文件夹,避免其内的应用随意使用手机的内存。

    使用一个例子来具体实 *** 一下,拍照获取图片,并设置到ImageVIEw中:

    把大象放到冰箱需要几个步骤?

    步骤一:打开相机:

// 相机public static final int CAMERA_REQUEST_CODE = 1004;SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_ss");private file tempfile; // 中转的文件private Uri mimguri;/**     * 开启相机     * @param activity     */    public voID toCamera(Activity activity) {        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        String filename = simpleDateFormat.format(new Date());        tempfile = new file(Environment.getExternalStorageDirectory(), filename + ".jpg");        // 7.0 以下        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {            mimguri = Uri.fromfile(tempfile);        } else {            // 7.0 利用fileProvIDer            String authority = activity.getPackagename() + ".fileprovIDer"; // 需要在配置文件中配置            mimguri = fileProvIDer.getUriForfile(activity, authority, tempfile);            // 添加权限            i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);        }        LogUtils.i("toCamera mimguri = " + mimguri);        i.putExtra(MediaStore.EXTRA_OUTPUT, mimguri);        activity.startActivityForResult(i, CAMERA_REQUEST_CODE);    }

    步骤二:设置拍摄图片的回调:

    private file uploadfile = null;    @OverrIDe    protected voID onActivityResult(int requestCode, int resultCode, Intent data) {        LogUtils.i("onActivityResult requestCode = " + requestCode);        if (resultCode == Activity.RESulT_OK) {            if (requestCode == CAMERA_REQUEST_CODE) {                uploadfile = fileHelper.getInstance().getTempfile();            }        }        // 设置头像        if (uploadfile != null) {            Bitmap bitmap = BitmapFactory.decodefile(uploadfile.getPath());            iv_photo.setimageBitmap(bitmap);        }        super.onActivityResult(requestCode, resultCode, data);    }

    步骤三:设置fileProvIDer

    小步骤1.设置xml/file_path.xml 文件

小步骤2.设置AndroIDManifest文件

在Application节点中添加

        <!-- 兼容Android7.0的ProvIDer -->        <provIDer            androID:name="androIDx.core.content.fileProvIDer"            androID:authoritIEs="{pkgname}.fileprovIDer"            androID:exported="false"            androID:grantUriPermissions="true">            <Meta-data                androID:name="androID.support.file_PROVIDER_PATHS"                androID:resource="@xml/filepaths" />        </provIDer>

其中authoritIEs 就是上面 步骤一 中设置的 authority,包名自己设置好即可。

解释一下其中几个标签:

androID:exported="false" //不允许跨进程访问
androID:grantUriPermissions="true" // 步骤一种添加的flag的权限

是不是跟把大象放进冰箱的步骤一样多?哈哈哈

过程中遇到的问题:

1. 如果系统拍照的图片过大,那么直接设置进去将发生OOM

解决办法:可以看我之前的博客,进行一下图片压缩

2. URI获取不到真实地址的问题,具体是:头像如果从相册中获取的话,获取到的图片路径并非真实路径,而是如下:

/external/images/media/134216

解决办法:

    1.首先通过 onActivityResult 中拿到系统返回的intent,通过intent.getData(),拿到返回的Uri

    2.处理Uri并返回真实路径:

/storage/emulated/0/MagazineUnlock/magazine-unlock-01-2.3.4332-_035B5B61EAFA5DB2B9982DCA612BA53C.jpg
    /**     * 根据Uri获取真实的图片地址     * @param context     * @param uri     * @return     */    public String getRealimgPathFromUri(Context context, Uri uri) {        String[] proj = {MediaStore.Images.Media.DATA};        CursorLoader cursorLoader = new CursorLoader(context, uri, proj, null, null, null);        Cursor cursor = cursorLoader.loadInBackground();        int columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);        cursor.movetoFirst();        String path = cursor.getString(columnIndex);        cursor.close();        return path;    }

下面把 跳转相册 的方法,也给大家贴一下:

    // 相册    public static final int ALBUM_REQUEST_CODE = 1005;    /**     * 跳转到相册     *     * @param activity     */    public voID toAlbum(Activity activity) {        Intent i = new Intent(Intent.ACTION_PICK);        i.setType("image/*");        activity.startActivityForResult(i, ALBUM_REQUEST_CODE);    }

   

遇到问题不要害怕,咱们见招拆招,没有解决不了的问题,如果有,那看看别人有啥好的解决办法没,skr~~

总结

以上是内存溢出为你收集整理的Android 7.0 之 FileProvider运用:拍照获取头像并设置全部内容,希望文章能够帮你解决Android 7.0 之 FileProvider运用:拍照获取头像并设置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1060873.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存