[英]Application will take a picture, but will not save it
我正在尝试拍照并将其另存为 jpeg。 供您参考,如果有帮助,这是用户将访问的程序中的第三个活动,我希望将图片保存到 data/user/0/com.example.app/appdata/inv/inv_pics文件。 这是我所拥有的:
static String currentPhotoPath;
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 = new File (MainActivity.path+"/com.example.app/appdata/inv/inv_pics");
storageDir.mkdir();
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
currentPhotoPath = image.getAbsolutePath();
return image;
}
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
ex.printStackTrace();
// Error occurred while creating the File
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = Uri.parse((MainActivity.path+"/com.example.app/appdata/inv/inv_pics"));
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
}
我松散地遵循本教程。 我在我的清单文件中做了同样的事情,并创建了额外的file_paths
xml 文件。 我在第二种方法 ( photoURI
) 中使用了 Uri 来准确设置方法如何使用它,并使用教程中的参数。 这只是产生错误,所以我基本上将我的应用程序的文件路径硬编码在那里(我知道它不是“OOP”),现在代码几乎可以工作了。
当我运行应用程序并进入活动时,它会打开相机。 那太棒了。 我点击按钮拍照,屏幕冻结了一秒钟,但没有给我底部的“重试”或“确定”按钮 - 预期的结果。
理想功能(再次供您参考):
进入这个活动。 它打开一个摄像头。 (我在这里。)当我拍照时,它会问我“重试”或“确定”(如上所述。)如果我单击“确定”,文件名将被写入文本文件,稍后将在该文件中读取以将图片设置为Image Button
上的Image Button
。
提前致谢!
编辑 :
我不相信这是权限问题,a)我在清单中声明了权限,b)第一种方法确实创建了文件,它只是空白,这让我知道代码至少运行到photoFile = createImageFile();
在第二种方法中。
因为我知道你可能会问,下面是当我尝试使用教程提供的代码时它给我的错误:
Process: com.example.app, PID: 4700
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.app/files/Pictures/JPEG_20191201_235937_8382995102420149896.jpg
at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:739)
at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418)
at com.erthad.boutique.InventoryActivity2.dispatchTakePictureIntent(InventoryActivity2.java:59)
at com.erthad.boutique.InventoryActivity2.access$000(InventoryActivity2.java:21)
at com.erthad.boutique.InventoryActivity2$1.onClick(InventoryActivity2.java:82)
at android.view.View.performClick(View.java:7341)
at android.view.View.performClickInternal(View.java:7307)
at android.view.View.access$3200(View.java:846)
at android.view.View$PerformClick.run(View.java:27796)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7156)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)```
使用 Base64 将图片作为字符串获取:
从内部读取
public StringBuilder fromInternal(String filename) {
StringBuilder sb = new StringBuilder();
try {
FileInputStream fileInputStream = context.openFileInput(filename);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
sb.append(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb;
}
将文件保存到内部:
public void toInternal(String data,String sFileName){
File file = new File(Environment.getExternalStorageDirectory()+"/"+sFileName);
byte[] bytes = data.getBytes();
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file);
outputStream.write(bytes);
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
并在您的AndroidManifest.xml
添加此权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
在阅读了 DoFlamingo 的评论和答案后,我得到了答案,因此部分归功于他。
问题实际上是我没有写入正确的存储。 但解决方案是我最初没想到的。 该教程实际上是正确的。 我尝试编辑paths.xml
文件中的目录以指向我开始编写代码时使用的目录(即data/data/user/0/com.example.app/appdata/inv/inv_pics
)已经指出了 DoFlamingo 在说什么 - 以及教程(即storage/emulated/XXX
)。
所以,这是为了让事情变得比他们需要的更复杂。 如果它对某人有帮助,我会留下这个帖子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.