美文网首页相机-相册适配Android相关
安卓拍照支持适配7.0 takePhoto

安卓拍照支持适配7.0 takePhoto

作者: 陈桐Caliburn | 来源:发表于2019-08-28 14:36 被阅读0次

webview input说明

安卓webview禁用input,网上查看各种方案,都存在弊端。
经过实践,完整可用调研了支持拍照和图片选择上传。

1、webview支持input标签
2、安卓拍照支持适配7.0 takePhoto

1、快速解决BUG: exposed beyond app through ClipData.Item.getUri()

第一种方法:拷贝application

  // android 7.0系统解决拍照的问题
   StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
   StrictMode.setVmPolicy(builder.build());
   builder.detectFileUriExposure();

第二种方法:针对sdk 24加入兼容性方案FileProvider

    private void takePhoto() {
        String fileName = "IMG_" + DateFormat.format( "yyyyMMdd_hhmmss", Calendar.getInstance( Locale.CHINA ) ) + ".jpg";
        // 步骤一:创建存储照片的文件
        String imagePath = activity.getFilesDir() + File.separator + "images" + File.separator + fileName;
        File file = new File( imagePath );
        //创建文件夹
        if (!file.getParentFile().exists())
            file.getParentFile().mkdirs();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //步骤二:Android 7.0及以上获取文件 Uri
            imageUri = FileProvider.getUriForFile( activity, activity.getPackageName() + ".fileprovider", file );
        } else {
            //步骤三:获取文件Uri
            imageUri = Uri.fromFile( file );
        }

        Intent intent = new Intent();
        intent.addFlags( Intent.FLAG_GRANT_READ_URI_PERMISSION );
        intent.setAction( MediaStore.ACTION_IMAGE_CAPTURE );//设置Action为拍照
        intent.putExtra( MediaStore.EXTRA_OUTPUT, imageUri );//将拍取的照片保存到指定URI
        activity.startActivityForResult( intent, FILE_CHOOSER_RESULT_CODE );
    }

AndroidManifest.xml 配置FileProvider

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>

provider_paths.xml 路径转换规则

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <external-files-path path="/download" name="download"/>
    <external-path name="external_files" path="."/>
    <files-path  path="images/" name="my_images" />
</resources>

<paths>中可以定义以下子节点

子节点 对应路径方法 实际路径
files-path Context.getFilesDir() /data/data/com.xxx.xxx/files
cache-path Context.getCacheDir() /data/data/com.xxx.xxx/cache
external-path Environment.getExternalStorageDirectory() /storage/emulated/0
external-files-path Context.getExternalFilesDir(null) /storage/emulated/0/Android/data/com.xxx.xxx/files
external-cache-path Context.getExternalCacheDir() /storage/emulated/0/Android/data/com.xxx.xxx/cache

比如路径方法:
String imagePath = activity.getFilesDir() + File.separator + "images" + File.separator + fileName;

配置 path 是真实相对路径 ,name是路径别名

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <files-path  path="images/" name="my_images" />
</resources>

相关扩展:apk安装

public static void installApk(Context context,String apkName) {
    String apkPath = context.getExternalCacheDir().getPath()+ File.separator+"app"+File.separator +apkName;

    if (TextUtils.isEmpty(apkPath)){
        Toast.makeText(context,"更新失败!未找到安装包", Toast.LENGTH_SHORT).show();
        return;
    }

    File apkFile = new File(apkPath);

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri apkUri = null ;
    //Android 7.0 系统共享文件需要通过 FileProvider 添加临时权限,否则系统会抛出 FileUriExposedException .
    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){
       apkUri = FileProvider.getUriForFile(context, (Activity)context.getPackageName()+".fileprovider",apkFile);     intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }else {
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        apkUri = Uri.fromFile(apkFile);
    }
    intent.setDataAndType(apkUri,"application/vnd.android.package-archive");
    context.startActivity(intent);
}


//调用,apkPath 入参就是 xml 中共享的路径
installApk(context,"test.apk");

对应的file_paths.xml

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

相关文章

  • 安卓拍照支持适配7.0 takePhoto

    webview input说明 安卓webview禁用input,网上查看各种方案,都存在弊端。经过实践,完整可用...

  • 安卓7.0适配拍照

    分享适配7.0拍照遇到的问题。 authorities这个东西不能重复,不然两个app不能同时安装在同一手机上,$...

  • 安卓7.0的拍照适配

    在Android 7.0以上,在相机拍照和图片裁剪上,可能会碰到以下一些错误: Process: com.yuyh...

  • FileUriExposedException: file://

    前段时间把App的有关拍照的代码写好了,也适配了安卓7.0,把我们老大的华为的手机搞来玩玩,偷偷给升级到了安卓7....

  • 适配安卓7.0系统相机拍照

    Android 7.0 提供新功能以提升性能、生产效率和安全性。通过新的系统行为测试您的应用,以节省电量和内存。充...

  • 适配安卓7.0 :安装 之路

    安卓之路,那真可谓是 路漫漫其修远兮,刚适配好 安卓6.0 的动态权限,如今有要适配 安卓7.0 的私有文件,有什...

  • 图片处理工具

    Android7.0 完美适配——FileProvider 拍照裁剪全解析 适配 android7.0 中的拍照相...

  • Appium适应Android7.0

    Appium适配Android7.0以上版本 测试机型: 华为荣耀V9 安卓版本: Android7.0 appi...

  • Android 系统相机的简单调用

    调用系统相机完成相机功能 系统适配:安卓6.0 安卓7.0参考链接:1. 2.开发测试工具:Android St...

  • Android7.0(N)版本发现FileUriExposedE

    开发安卓软件使用拍照功能时,在7.0(N)level 24上,使用file//:Uri形式的Uri获取拍照图片发生...

网友评论

    本文标题:安卓拍照支持适配7.0 takePhoto

    本文链接:https://www.haomeiwen.com/subject/wcnpectx.html