gpt4 book ai didi

android - 在外部存储中保存图像在模拟器上有效,但在具有相同源代码的物理手机上无效

转载 作者:行者123 更新时间:2023-12-04 01:32:11 27 4
gpt4 key购买 nike

我正在尝试从服务器保存一些照片。我已经使用了我发现的一些部件,并且它在模拟器上工作(我使用的照片目录为 Envinronment.getExternalStorageDirectory)。现在,我尝试将应用程序添加到我的手机,但它不起作用。当我尝试从内存中获取图像时,出现错误:E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException:/storage/emulated/0/PictogrameProbleme/20.png: open failed: ENOENT (No such file or directory) 这意味着照片一开始就没有保存在那里。这是我运行的用于保存和检索照片的代码:

最新编辑:经过认真的测试和调试等等,我遇到了另一个问题:无法使用消息“未实现”创建图像解码器

编辑:我还在 manifest 中添加了所需的 permissions,并在 runtime 中请求它们。

编辑:我已经编辑了保存在External memory 上的代码,但是同样的错误发生了。我使用 logcat 获取了 LOCATIE,应该从那里检索文件,并且 logcat 给我文件的位置:storage/仿真/0/...

public static String saveToSdCard(Bitmap bitmap, String filename) {

String stored = null;

File sdcard = Environment.getExternalStorageDirectory() ;

File folder = new File(sdcard.getAbsoluteFile(), "/PictogrameProbleme");//the dot makes this directory hidden to the user
folder.mkdir();
File file = new File(folder.getAbsoluteFile(), filename + ".png") ;
if (file.exists())
return stored ;

try {
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
stored = "success";
} catch (Exception e) {
e.printStackTrace();
}
return stored;
}

public static File getImage(String imagename) {

File mediaImage = null;
try {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root);
if (!myDir.exists())
return null;

mediaImage = new File(myDir.getPath() + "/PictogrameProbleme/"+imagename);
Log.d("LOCATIE",myDir.getPath() + "/PictogrameProbleme/"+imagename );
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mediaImage;
}
public static boolean checkifImageExists(String imagename)
{
Bitmap b = null ;
File file = ImageStorage.getImage(imagename+".png");
assert file != null;
String path = file.getAbsolutePath();

if (path != null)
b = BitmapFactory.decodeFile(path);

if(b == null || b.equals(""))
{
return false ;
}
return true ;
}
}

编辑:我添加了适用于模拟器但不适用于手机的代码。

编辑:添加权限。在 onCreate 中,我调用函数 requestWritePermission()

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if(requestCode == WRITE_PERMISSION){
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "Write Permission Failed");
Toast.makeText(this, "You must allow permission write external storage to your mobile device.", Toast.LENGTH_SHORT).show();
finish();
}
}
}

private void requestWritePermission(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},WRITE_PERMISSION);
}
}
}

同样在 list 中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

编辑:添加了我从 URL 获取照片的方式,可能是问题所在。

private void SalveazaPictograme(final String url, final String imagename) {
class GetImage extends AsyncTask<Object, Object, Object> {
String requestUrl = url;
String imagename_ = imagename;


@Override
protected Object doInBackground(Object... objects) {
try {
URL url = new URL(requestUrl);
URLConnection conn = url.openConnection();
bitmap = BitmapFactory.decodeStream(conn.getInputStream());

} catch (Exception ex) {
}
return null;
}

@Override
protected void onPostExecute(Object o) {
if (!ImageStorage.checkifImageExists(imagename_)) {
ImageStorage.saveToSdCard(bitmap, imagename_);
Log.d("LALA","lalalallalaa");
}

}
}
GetImage au = new GetImage();
au.execute();
}

我在程序开始时声明了位图

最佳答案

我有预感你的问题可能与你运行 Android Q 的手机有关。看看我对此 question 的回答.外部文件目录不应是 storage/emulated/0/ 而是 storage/emulated/0/Android/data/your.package.name/ 尝试使用 Context .getExternalFilesDir(null) 以获取您的外部文件目录。

documentation可以看出Environment.getExternalStorageDirectory() 自 API 29 起已弃用,如果您的目标是 Android Q,则不会返回有效的文件路径。

如果这有助于解决您的问题,请告诉我。

关于android - 在外部存储中保存图像在模拟器上有效,但在具有相同源代码的物理手机上无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60710044/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com