该代码仅适用于某些安卓版本



我想从可绘制对象中保存一张图片。该应用程序可以工作,但仅适用于低于API 22的安卓版本。在较新版本中,图像不会保存在库中。

我的代码:

public class MainActivity extends AppCompatActivity {
Bitmap anImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Drawable myDrawable = getResources().getDrawable(R.drawable.tapeta1, null);
anImage = ((BitmapDrawable) myDrawable).getBitmap();
}
public void addImageToGallery(View view) {
int e = view.getId();
switch (e) {
case R.id.button:
saveImageToExternalStorage(anImage);
Toast.makeText(getApplicationContext(), "Saved successfully, Check gallery", Toast.LENGTH_SHORT).show();
break;
}
}
private void saveImageToExternalStorage(Bitmap finalBitmap) {
String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File myDir = new File(root + "/saved_images_1");
myDir.mkdirs();
Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
String fname = "Image-" + n + ".jpg";
File file = new File(myDir, fname);
if (file.exists())
file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
MediaScannerConnection.scanFile(this, new String[]{file.toString()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
}
}

检查您是否已从

设置 ->应用 ->

应用名称 ->权限

如果此解决方案解决了您的问题,请阅读 - https://developer.android.com/training/permissions/requesting.html

在你之前,通过传递写入外部存储权限来调用 oncreate 方法调用请求权限。这将显示用户授予权限。您可以覆盖 onpermissions导致 在活动中查看权限的结果 如果授予,您可以继续保存文件 。如果您不想要所有这些,请保存在 内部存储 .getfilesdir 方法将为您提供应用程序内部目录的路径,并且不需要运行时权限。

您需要从应用程序请求运行时权限。

if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}

最新更新