我正在尝试使用BitmapFactory。decodefile()以创建相机照片的缩小版本,并将其设置为我的framelayout中的imageview。我遵循Android开发者的以下说明:https://developer.android.com/training/camera/photobasics.html在这些说明中,文件被创建并存储在一个fileprovider中,fileprovider保存一些xml格式的元数据文件。不知怎么的,位图工厂。decodefile()似乎无法访问此文件,该文件存储的图片的内容uri位于文件提供程序内。fileprovider在androidmanifest文件中创建,如下所示:
<provider
android:authorities="mypackagename.fileprovider"
android:name="android.support.v4.content.FileProvider"
android:exported="false" android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" >
</meta-data>
</provider>
文件路径xml文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/mypackagename/files/Pictures/" />
</paths>
图片所在的文件名通过以下方法生成:
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName,".jpg",storageDir);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = image.getAbsolutePath();
Log.d("absolute",""+image.getAbsolutePath());
return image;
}
代码启动意图,以便使用startactivityforresult()拍照,如下所示:
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (i.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile (this,"mypackagename.fileprovider",photoFile);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(i,TAKE_PICTURE);
}
}
现在,onActivityForResult()方法启动,但如果我像这样设置if语句if(requestCode==TAKE_PICTURE
当尝试缩放图片位图时,我有以下返回-1的代码,这意味着“根据BitmapFactory类的android参考文档”,“解码文件时出现问题”。我不知道为什么会有问题。下面是返回-1的代码:
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
photoW和photoH都返回-1。请记住,变量mCurrentPhotoPath是在方法CreateImageFile()中初始化的,一直到问题的顶部。
我也试过,
BitmapFactory.decodeFile(photoFile.getAbsolutePath(), bmOptions);
但仍然是相同的结果,实际上是McCurrentPhotoPath和photoFile。getAbsolutePath()是相等的字符串。
我认为带有元数据xml文件的文件提供者以某种方式对BitmapFactory隐藏了文件路径。解码文件()。
照片是在我测试应用程序时拍摄的,也存储在我的手机图片库中。
请提供任何意见或建议,因为我需要继续使用tess two库,并使用相机中的图片执行OCR。
谢谢你的建议
我在这里结束,因为我正在寻找一种方法,从内部存储器中图像的Uri
获取Bitmap
,该图像是用FileProvider
编写的。
(按照此答案将图像写入内部存储器:https://stackoverflow.com/a/30172792/529663)
使用GrAndroidDeveloper的答案,我可以得到一个可读的位图
图像。以下是方法:
ContentResolver cr = getApplicationContext().getContentResolver();
InputStream is = cr.openInputStream(uri);
Bitmap image = BitmapFactory.decodeStream(is);
if (is != null) is.close();
这对于官方facebook共享非常有用,因为它需要一个
位图。
我遇到了完全相同的问题,这就是我处理它的方式:首先设置i.set标志(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
如上所述,在启动相机之前。然后,不要使用BitmapFactory.decodeFile()
方法,因为它只适用于使用Uri.fromFile()
检索到的Uris类型,但不适用于file:///code>代码>内容://
类型的Uris检索使用FileProvider.getUriForFile()
这是API所需的方式
相反,使用ContentResolver打开InputStream并按如下方式解码图像:
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
ContentResolver cr = getActivity().getContentResolver();
InputStream input = null;
InputStream input1 = null;
try {
input = cr.openInputStream(photoUri);
BitmapFactory.decodeStream(input, null, bmOptions);
if (input != null) {
input.close();
}
} catch (Exception e) {
e.printStackTrace();
}
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
try {
input1 = cr.openInputStream(photoUri);
Bitmap takenImage = BitmapFactory.decodeStream(input1);
if (input1 != null) {
input1.close();
}
} catch (Exception e) {
e.printStackTrace();
}
请注意,为了获得位图,您必须打开第二个输入流,因为第一个不能重复使用。
问题内容: 我知道您可以创建目录和文件,但是无法一次性完成这两种操作吗? 即如果文件夹不存在时我要执行以下操作: 错误: 有没有人想出一个功能来解决这个问题? 问题答案: 使用两个命令在一个外壳线面相结合: 注意:以前我建议使用来分隔两个命令,但是正如@trysis所指出的,在大多数情况下使用它可能更好,因为万一失败也不会执行。(否则,这可能会导致您可能没有想到的问题。)
这是另一个: 另外,我在其他片段中使uri公共静态化,以便在MainActivity中可以访问,下面是将捕获的图像加载到ImageView的代码:
问题内容: 我在具有基本HTTP服务器(没有Express或Connect或类似的东西)的Node服务器上使用Socket.IO。默认情况下,Socket.IO将客户端文件提供给 /socket.io/socket.io.js 我希望能够将该基本路径更改为其他内容,例如 /foo/bar/socket.io/socket.io.js 是否有任何内置方法来执行此操作,或者是否有任何不更改Socket
问题内容: 我只想从完整路径到文件获取文件夹路径。 例如,我想要得到(不包括)。 我已经尝试过这样的事情: 但是它给了我这样的结果: 这不是我需要的结果(为)。 关于如何获取文件路径的任何想法? 问题答案: 您几乎可以使用该功能了。您只需要加入字符串,如下所示。 虽然,我建议使用该函数来执行此操作,但是您只需要传递字符串即可,它将为您完成工作。由于您似乎在Windows上,因此也考虑使用该功能。一
我有两个app:app1和app2。 App2具有: paths.xml: App2在其活动中从App1接收获取映像URI的请求。确定URI后,App2活动执行以下操作: 从App2接收回结果后,App1执行以下操作: 在App1中,从App2返回时,我得到以下异常: java.lang.SecurityException:权限拒绝:从ProcessRecord{52a99eb0 3493:com
我正在创建一个应用程序,从画廊上传选定的图像,并上传到一个网络服务。web服务需要所选图像的文件名以及文件内容的base64编码。我已经设法用硬编码的文件路径实现了这一点。然而,我很难获得图像的真实文件路径。我在网上看了很多资料,找到了这段代码,但它对我不起作用: 我得到这个错误: 编辑 忘了提到我正在使用Kitkat。看起来我的问题与KitKat有关。我发现了这个(见下文),它帮助我让我的应用程