簡體   English   中英

Android 12 - CAMERA2 - 保存時圖片損壞

[英]Android 12 - CAMERA2 - Pictures are corrupted when saving

我在使用此特定設備進行測試時發現異常,詳細信息如下:

硬件:三星,SM-A326B(智能手機三星A32)

操作系統:安卓 12

一個用戶界面: 4.1

谷歌播放: 22 年 5 月 1 日

補丁級別: 01/6/22

這些是正常工作的設備的規格,我看到的唯一差異與補丁級別的不同版本有關。

硬件:三星,SM-A515F(智能手機三星A51)

操作系統:安卓 12

一個用戶界面: 4.1

谷歌播放: 22 年 5 月 1 日

補丁級別: 01/5月/22

我在我的應用程序中實現了camera2的自定義,除了這個設備外,這總是有效的,具體的異常是圖像完全保存為白色並且已損壞,圖像只能由第三方軟件恢復。

這些是我在清單中要求的權限:

<uses-feature android:name="android.hardware.location.gps " />
<uses-feature android:name="android.hardware.location.network" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

這是我用來保存圖像的代碼

public void saveCameraImage(Image mImage, File mFile, String mOrientation, Context context) {
    ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
    byte[] bytes = new byte[buffer.remaining()];
    buffer.get(bytes);
    FileOutputStream fileOutputStream = null;
    try {
        fileOutputStream = new FileOutputStream(mFile);
        fileOutputStream.write(bytes);
    } catch (IOException e) {
        wil.WriteFile("saveImage - Exception: " + e.getMessage(), context);
    } finally {
        mImage.close();
        if (null != fileOutputStream) {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                wil.WriteFile("saveImage - Exception: " + e.getMessage(), context);
            } finally {
                saveExifData(mFile.getPath(), context);
                createThumbs(mOrientation, mFile, context);
            }
        }
    }
}

這是我命名為“saveExifData”的函數

private void saveExifData(String filepath, Context context) {
        try {
            if (filepath.endsWith(IMAGE_FORMAT)) {
                File file = new File(filepath);
                if (file.exists()) {
                    DbGest dbGest = DbGest.getInstance(context);
                    String dateTime = dbGest.getTimestampFromFileToSend(filepath, "dateTime", context);
                    String dateTimeGps = dbGest.getTimestampFromFileToSend(filepath, "gps", context);
                    String dateTimeDesc = dbGest.getTimestampFromFileToSend(filepath, "dateTimeDesc", context);
    
                    ExifInterface exifInterface = new ExifInterface(filepath);
                    exifInterface.setAttribute(ExifInterface.TAG_COPYRIGHT, "xxxxx ");
                    exifInterface.setAttribute(ExifInterface.TAG_MODEL, Build.MANUFACTURER + "," + Build.MODEL);
                    exifInterface.setAttribute(ExifInterface.TAG_SOFTWARE, dbGest.getSetting("appName", context));
                    exifInterface.setAttribute(ExifInterface.TAG_DATETIME, dateTime);
                    exifInterface.setAttribute(ExifInterface.TAG_DATETIME_ORIGINAL, dateTime);
                    exifInterface.setAttribute(ExifInterface.TAG_USER_COMMENT, "Immagine scattata tramite " + dbGest.getSetting("appName", context) + " il " + dateTimeDesc);
    
                    CoordinatesData position = DbGest.getInstance(context).getBetterPositionKnown(context);
                    exifInterface.setAttribute(ExifInterface.TAG_GPS_LATITUDE, String.valueOf(position.getLat()));
                    exifInterface.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, String.valueOf(position.getLng()));
                    exifInterface.setAttribute(ExifInterface.TAG_GPS_DATESTAMP, dateTimeGps);
                    exifInterface.setAttribute(ExifInterface.TAG_GPS_SPEED, String.valueOf(position.getSpeed()));
                    exifInterface.setLatLong(position.getLat(), position.getLng());
                    exifInterface.saveAttributes();
                }
            }
        } catch (Exception e) {
            wil.WriteFile("saveExifData - Exception: " + e.getMessage(), context);
        }
    }

所以我想這不是權限問題,也沒有例外,所以我不知道如何解決這個問題

經過多次測試和調試,我找到了錯誤的原因。

問題出在“saveExifData”中,出於某種原因,這行代碼

exifInterface.setAttribute(ExifInterface.TAG_COPYRIGHT, "xxxx");

這是問題的原因

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM