Java 应用程序将拍摄照片,但不会保存它
我正在尝试拍摄一张照片并将其保存为jpeg格式。供您参考,如果有帮助,这是用户将访问的程序中的第三个活动,我希望将图片保存到data/user/0/com.example.app/appdata/inv/inv_pics文件中。以下是我所拥有的:Java 应用程序将拍摄照片,但不会保存它,java,android,android-studio,camera,Java,Android,Android Studio,Camera,我正在尝试拍摄一张照片并将其保存为jpeg格式。供您参考,如果有帮助,这是用户将访问的程序中的第三个活动,我希望将图片保存到data/user/0/com.example.app/appdata/inv/inv_pics文件中。以下是我所拥有的: static String currentPhotoPath; private File createImageFile() throws IOException { // Create an image file
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);
}
}
}
我跟在后面。我在清单文件中也做了同样的操作,并创建了额外的文件路径
xml文件。我让第二个方法(photoURI
)中的Uri准确地设置了该方法的使用方式,参数与教程中的一样。这只是产生了错误,所以我基本上硬编码了我的应用程序的文件路径(我知道这不是“OOP”),现在代码几乎可以工作了
当我运行应用程序并进入活动时,它会打开相机。太好了。我点击按钮拍照,屏幕冻结了一秒钟,但没有给我底部的“重试”或“确定”按钮——这是预期的结果
理想功能(同样,仅供参考):
开始这项活动。它打开了一个摄像头。(我在这里。)当我拍照时,它会问我“重试”或“确定”(如上所述)。如果我单击“确定”,文件名将写入文本文件,稍后将在其中读取,以便将图片设置为图像按钮上的图像
提前谢谢
编辑:
我不认为这是权限问题,a)我在清单中声明了权限,b)第一个方法确实创建了文件,它只是空白,这让我知道代码至少运行到photoFile=createImageFile()第二种方法中的code>
因为我知道你可能会问,当我尝试使用教程提供的代码时,这里是它给我的错误:
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"/>
使用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"/>
在阅读了多弗拉明戈的评论和回答后,我找到了答案,所以部分归功于他
问题是,我没有将信息写入正确的存储空间。但解决办法是我一开始都没想到的。事实上,这是正确的。我试图编辑path.xml
文件中的目录,以指向我开始编写代码时使用的目录(即data/data/user/0/com.example.app/appdata/inv/inv_pics
),而它本应准确指向DoFlamingo所说的内容以及教程(即storage/emulated/XXX
)
所以,让事情变得更加复杂。我会把这封信挂起来,以防对别人有帮助 在阅读了多弗拉明戈的评论和回答后,我得到了答案,因此部分归功于他
问题是,我没有将信息写入正确的存储空间。但解决办法是我一开始都没想到的。事实上,这是正确的。我试图编辑path.xml
文件中的目录,以指向我开始编写代码时使用的目录(即data/data/user/0/com.example.app/appdata/inv/inv_pics
),而它本应准确指向DoFlamingo所说的内容以及教程(即storage/emulated/XXX
)
所以,让事情变得更加复杂。我会把这封信挂起来,以防对别人有帮助 字符串MainActivity.path只是应用程序的根路径。(data/user/0)也许你没有正确的权限?起初我是这么认为的,但后来我检查了目录本身。检查我的编辑。为什么要在与应用程序相同的位置保护图片?因为需要使用图像设置图像按钮的src
。我认为这是最好的方法。字符串MainActivity.path只是应用程序的根路径。(data/user/0)也许你没有正确的权限?起初我是这么认为的,但后来我检查了目录本身。检查我的编辑。为什么要在与应用程序相同的位置保护图片?因为需要使用图像设置图像按钮的src
。我想这是最好的方法。用base64解码你的图片。you have a string witch表示图片。然后使用toInternal()-函数将gernatet字符串保存在内部存储器上。使用base64解码图片。表示图片的字符串。然后使用toInternal()-函数将gernatet字符串保存在内部存储器上