if (Build.VERSION.SDK_INT >= 24) { imageUri = FileProvider.getUriForFile(AddPaizhaoAct.this, "com.exampleytpeak.paizhao.fileprovider", outputImage); } else { imageUri = Uri.fromFile(outputImage); }
时间: 2023-06-27 12:08:13 浏览: 105
这段代码是用于获取一个文件的 Uri,具体的实现逻辑如下:
如果设备的 Android 版本号大于等于 24,那么使用 FileProvider.getUriForFile() 方法来获取文件的 Uri。FileProvider 是一种特殊的 ContentProvider,它能够将文件封装成 Content Uri,这样就可以方便地共享给其他应用使用,而不必暴露文件的真实路径。FileProvider.getUriForFile() 方法需要传入 3 个参数:上下文对象、FileProvider 的 authority(即在 AndroidManifest.xml 中定义的 provider 标签的 authorities 属性)、要共享的文件。它会返回一个 Content Uri,该 Uri 已经适配了 Android N(API level 24)及以上版本的安全性限制。
如果设备的 Android 版本号小于 24,那么直接使用 Uri.fromFile() 方法来获取文件的 Uri。该方法会将文件的路径直接转换成 Uri,并返回。但是,在 Android N 及以上版本中,该方法会抛出 FileUriExposedException 异常,因为直接暴露文件的真实路径会存在安全隐患。因此,在 Android N 及以上版本中,应该使用 FileProvider 来封装文件的路径。
相关问题
ivCamera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //创建File对象,用于存储拍照后的图片 File outputImage = new File(getExternalCacheDir(), System.currentTimeMillis() + ".jpg"); imagePath = outputImage.getPath(); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT >= 24) { imageUri = FileProvider.getUriForFile(AddPaizhaoAct.this, "com.exampleytpeak.paizhao.fileprovider", outputImage); } else { imageUri = Uri.fromFile(outputImage); } // 启动相机 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, REQUEST_CAPTURE); } });
这段代码是一个点击事件的监听器,当ivCamera控件被点击时会启动相机拍照,并将拍摄的照片存储到指定的路径中。具体来说,代码中首先创建一个File对象outputImage用于存储拍照后的图片,其路径为应用的外部缓存目录下,并以当前时间戳命名。然后判断该文件是否存在,如果存在则删除并重新创建一个新文件。接着根据Android SDK版本号的不同,分别使用不同的方式创建imageUri对象,并将其作为参数放入Intent中。最后调用startActivityForResult()方法启动相机程序,并将请求码REQUEST_CAPTURE作为参数传入,以便在拍照完成后能够接收到返回的数据。
iv_camera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //创建File对象,用于存储拍照后的图片 File outputImage = new File(getExternalCacheDir(), System.currentTimeMillis() + ".jpg"); imagePath = outputImage.getPath(); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT >= 24) { imageUri = FileProvider.getUriForFile(MainActivity.this, "com.exampleytpeak.paizhao.fileprovider", outputImage); } else { imageUri = Uri.fromFile(outputImage); } // 启动相机 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, REQUEST_CAPTURE); } });
这是一个 Android Studio 中的代码段,主要是实现一个拍照按钮的点击事件。当用户点击该按钮时,程序会创建一个File对象用于存储拍摄后的照片。然后,通过判断当前设备的Android版本是否大于等于24,来选择使用FileProvider获取照片的Uri,还是使用旧版方式获取Uri。最后,使用Intent启动相机应用,拍摄照片并将其保存到指定的路径中。完成照片拍摄后,程序会返回一个结果码,用于判断照片是否拍摄成功。
阅读全文