簡體   English   中英

Android 應用程序對 SD 卡的讀取權限停止在特定平板電腦 (Samsung T290) 上使用軟件更新

[英]Android app's reading access to SD card stopped working on a specific tablet (Samsung T290) with software update

為我們開發的應用程序 ( https://play.google.com/store/apps/details?id=io.rff.saide.knowhow ) 在選擇國家后第一次開始下載其國家特定的內容。 有兩種來源選項:來自 SD 卡或互聯網。 第二個選項仍然有效(在通常連接不良的情況下太慢),但第一個選項在包括從 Android 9 升級到 10 的軟件更新后停止在三星的 T290(許多設備測試)上工作 - 但是,它仍然有效在其他平板電腦型號上很好,比如聯想 M8。

第一步:更新到 2020 年 5 月的安全補丁:SD 卡選項仍然有效 第二步:更新到 2020 年 7 月的補丁以及 Android 10:SD 卡選項不再工作 第三步:更新到 2020 年 12 月的補丁:仍然沒有改善

該應用程序在 G-Suite(托管設備,該應用程序被列入白名單)下運行,但 Google 保證這無法解釋這種行為(“如果它適用於一台設備,它將適用於所有設備”)。

開發人員重新編譯了一個新版本,以確保它包含最新的 Android 更新。 他也確信各自的代碼行不可能是原因。

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

這個問題的根源是什么? 必須是平板電腦的系統軟件嗎?

var ExternalStorageSdcardAccess = function (_fileHandler, _errorHandler) {
var errorHandler = _errorHandler || _defultErrorHandler;
var fileHandler = _fileHandler || _defultFileHandler;
var root = "file:///";
return {
    scanRoot: scanRoot,
    scanPathList: scanPathList,
    scanPath: scanPath
};
function scanPath(path) {
    window.resolveLocalFileSystemURL(path, _gotFiles, errorHandler);
}
function scanRoot() {
    scanPath(root);
}
function scanPathList(arrayOfPath) {
    arrayOfPath.forEach(function (p) {
       scanPath(p);
    });
}

function _gotFiles(entry) {
    if (entry.isFile) {
        fileHandler(entry);
    } else {
        var dirReader = entry.createReader();
        dirReader.readEntries(function (entryList) {
            entryList.forEach(function (entr) {_gotFiles(entr);});
        }, errorHandler);
    }
}

function _defultFileHandler(fileEntry) {
    console.log("FileEntry: " + fileEntry.name + " | " + fileEntry.fullPath);
}

function _defultErrorHandler(error) {
    console.log('File System Error: ' + error.code);
}
};

function getSDCardFolder() {


ExternalStorageSdcardAccess(fileHandler, fileError).scanPath("file:///storage/");

function fileHandler(fileEntry) {
    if ((fileEntry.name === app.id + "." + countryCode + '.txt') && (SDCardRoot === '')) {
       var url = fileEntry.toURL();
       SDCardRoot = url.substring(0, url.lastIndexOf('/') + 1);
    }
function fileError(error) {}
}

function useSDCard() {
  app.request.get(SDCardRoot + app.id + "." + countryCode + ".txt", {},
   function (data) {
  if (version !== data) {
    savedVersion = data;
    if (navigator.connection.type === Connection.NONE) {
      document.getElementById('internet-update').style.opacity = 0.5;
      document.getElementById('internet-update').style.pointerEvents = 'none';
    }
    loadingContent = false;
    openUpdate();
  } else {
    app.dialog.alert('The content is up-to-date.');
    loadingContent = false;
  }
});

}

使用AndroidManifest.xml臨時選擇退出范圍存儲,同時仍以 Android 10 為目標:

<!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
<application android:requestLegacyExternalStorage="true" />

這只能在實現范圍存儲之前使用,因為 Android 11 的行為會有所不同:

在您將應用更新為目標 Android 11(API 級別 30)后,當您的應用在 Android 11 設備上運行時,系統會忽略requestLegacyExternalStorage屬性,因此您的應用必須准備好支持范圍存儲為這些設備上的用戶遷移應用數據設備。

請參閱https://developer.android.com/about/versions/11/privacy/storage

為范圍存儲做准備(Android Dev Summit '19)

暫無
暫無

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

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