gpt4 book ai didi

java - Android将位图保存到图像文件

转载 作者:行者123 更新时间:2023-12-04 23:49:58 24 4
gpt4 key购买 nike

如何将位图保存到图像文件? (png/jpg 任何类型都不在乎...)
我正在运行设备(海思)和安卓应用程序。
Android 和设备通过套接字进行通信。
设备发送图像 (h.264) 并在 Android 上的 TextureView 上显示。
我可以使用 textureView.getBitmap() 从 TextureView 获取位图.

我做了一个按钮按钮来保存图片,textureView.getBitmap() .

<Button
android:id="@+id/btnSavePng"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onBtnSavePng"
android:text="savePicture" />
并且,onclick 功能如下。

public String getCurrentTimeString() {
int yyyy = Calendar.getInstance().get(Calendar.YEAR);
int MM = Calendar.getInstance().get(Calendar.MONTH) + 1;
int dd = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
int hh = Calendar.getInstance().get(Calendar.HOUR);
int mm = Calendar.getInstance().get(Calendar.MINUTE);
int ss = Calendar.getInstance().get(Calendar.SECOND);

String result = yyyy+"-"+MM+"-"+dd+" "+hh+":"+mm+":"+ss;
return result;
}

public void onBtnSavePng(View view) {
try {
File storage = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
String fname = getCurrentTimeString() + ".jpg";
File tp = new File(storage, fname);
Bitmap bm = textureView.getBitmap();
tp.createNewFile(); // Result of File.createNewFile() ignored

FileOutputStream ot = new FileOutputStream(tp);
bm.compress(Bitmap.CompressFormat.JPEG, 100, ot);
ot.close();
} catch(Exception e) {
Log.d("onBtnSavePng", e.toString()); // java.io.IOException: Operation not permitted
}
}
我允许使用权限 AndroidManifest.xml像下面,和 android:requestLegacyExternalStorage="true"正在申请中。
    <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
我的代码有问题吗?
如果是这样,如何将位图保存为 png 或 jpg 文件?
我想,我的应用程序无法访问目录。
感谢您阅读我的问题。

自我解决。

public void onBtnSavePng(View view) {
try {
String root = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).toString();
File myDir = new File(root + "/saved_images");
myDir.mkdirs();
String fname = getCurrentTimeString() + ".jpg";
File file = new File(myDir, fname);

FileOutputStream out = new FileOutputStream(file);
Bitmap bm = textureView.getBitmap();
bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch( Exception e) {
Log.d("onBtnSavePng", e.toString());
}

我不明白为什么我的代码还没有工作。
无论如何,感谢所有帮助我的人。
我会尝试所有的回复代码。
谢谢你。

最佳答案

1.如果您还没有请求运行时权限,请勾选:https://developer.android.com/training/permissions/requesting
2.或者如果你的android高于10:
https://developer.android.com/about/versions/11/privacy/storage#scoped-storage

  • 将应用更新为面向 Android 11 后,系统会忽略 requestLegacyExternalStorage 标志。

  • 然后您必须使用 SAF 或 MediaStore API 将位图存储在“公共(public)目录”中。
    新加坡武装部队:
    https://developer.android.com/guide/topics/providers/document-provider
    媒体商店 API:
    https://developer.android.com/reference/android/provider/MediaStore
    public void onBtnSavePng(View view) {
    try {
    String fileName = getCurrentTimeString() + ".jpg";

    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    values.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/");
    values.put(MediaStore.MediaColumns.IS_PENDING, 1);
    } else {
    File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
    File file = new File(directory, fileName);
    values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath());
    }

    Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

    try (OutputStream output = getContentResolver().openOutputStream(uri)) {
    Bitmap bm = textureView.getBitmap();
    bm.compress(Bitmap.CompressFormat.JPEG, 100, output);
    }
    } catch (Exception e) {
    Log.d("onBtnSavePng", e.toString()); // java.io.IOException: Operation not permitted
    }
    }

    关于java - Android将位图保存到图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65767693/

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