欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android4.4下MediaProvider無法向外置SD卡中文件寫數(shù)據(jù)的解決方法

 更新時間:2015年10月28日 14:39:27   作者:lsdmx2016  
這篇文章主要介紹了Android4.4下MediaProvider無法向外置SD卡中文件寫數(shù)據(jù)的解決方法,實例分析了Android4.4下針對讀寫限制的修改技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了Android4.4下MediaProvider無法向外置SD卡中文件寫數(shù)據(jù)的解決方法。分享給大家供大家參考,具體如下:

Android4.4平臺限制應(yīng)用對外置SD卡的讀寫權(quán)限。MediaProvider通過 checkAccess方法 限制對外置SD卡的讀寫。

private void checkAccess(Uri uri, File file, int modeBits) throws FileNotFoundException {
  final boolean isWrite = (modeBits & MODE_WRITE_ONLY) != 0;
  final String path;
  try {
   path = file.getCanonicalPath();
  } catch (IOException e) {
   throw new IllegalArgumentException("Unable to resolve canonical path for " + file, e);
  }
  Context c = getContext();
  boolean readGranted =
    (c.checkCallingOrSelfUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
    == PackageManager.PERMISSION_GRANTED);
  if (path.startsWith(sExternalPath) || path.startsWith(sLegacyPath)) {
   if (!readGranted) {
    c.enforceCallingOrSelfPermission(
      READ_EXTERNAL_STORAGE, "External path: " + path);
   }
   if (isWrite) {
    if (c.checkCallingOrSelfUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
      != PackageManager.PERMISSION_GRANTED) {
     c.enforceCallingOrSelfPermission(
       WRITE_EXTERNAL_STORAGE, "External path: " + path);
    }
   }
  } else if (path.startsWith(sCachePath)) {
   if (!readGranted) {
    c.enforceCallingOrSelfPermission(
      ACCESS_CACHE_FILESYSTEM, "Cache path: " + path);
   }
  //外置SD卡,isWrite = true
  } else if (isWrite) {
   // don't write to non-cache, non-sdcard files.
   throw new FileNotFoundException("Can't access " + file);
  } else if (isSecondaryExternalPath(path)) {
   // read access is OK with the appropriate permission
   if (!readGranted) {
    c.enforceCallingOrSelfPermission(
      READ_EXTERNAL_STORAGE, "External path: " + path);
   }
  } else {
   checkWorldReadAccess(path);
  }
}

從以上代碼我們看出,如果sExternalPath 沒有指向外置SD卡并且path 是外置SD卡的文件路徑,那么該方法 就會拋出FileNotFoundException,sExternalPath 一般都是指向內(nèi)部存儲

在應(yīng)用中 我們通常 通過contentresolver.openOutputStream(uri) 來打開存儲卡上媒體文件的文件流,如果媒體文件在外置SD卡上,那么我們就無法打開對應(yīng)的文件流,自然肯定無法向其中寫數(shù)據(jù)。

為了解決該問題,我們只能改變Android4.4平臺下Mediaprovider 對向SD卡寫數(shù)據(jù)的限制,具體修改方式如下

private void checkAccess(Uri uri, File file, int modeBits) throws FileNotFoundException {
  final boolean isWrite = (modeBits & MODE_WRITE_ONLY) != 0;
  final String path;
  try {
   path = file.getCanonicalPath();
  } catch (IOException e) {
   throw new IllegalArgumentException("Unable to resolve canonical path for " + file, e);
  }
  Context c = getContext();
  boolean readGranted =
    (c.checkCallingOrSelfUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION)
    == PackageManager.PERMISSION_GRANTED);
  if (path.startsWith(sExternalPath) || path.startsWith(sLegacyPath) || isSecondaryExternalPath(path)) {
   if (!readGranted) {
    c.enforceCallingOrSelfPermission(
      READ_EXTERNAL_STORAGE, "External path: " + path);
   }
   if (isWrite) {
    if (c.checkCallingOrSelfUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
      != PackageManager.PERMISSION_GRANTED) {
     c.enforceCallingOrSelfPermission(
       WRITE_EXTERNAL_STORAGE, "External path: " + path);
    }
   }
  } else if (path.startsWith(sCachePath)) {
   if (!readGranted) {
    c.enforceCallingOrSelfPermission(
      ACCESS_CACHE_FILESYSTEM, "Cache path: " + path);
   }
  //外置SD卡,isWrite = true
  } else if (isWrite) {
   // don't write to non-cache, non-sdcard files.
   throw new FileNotFoundException("Can't access " + file);
  } else {
   checkWorldReadAccess(path);
  }
},

對于滿足isSecondaryExternalPath(path) 的文件路徑,我們都可以進行讀寫,對于外置SD卡的文件而言 isSecondaryExternalPath(path) 肯定為true

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • Android實現(xiàn)搜索本地音樂的方法

    Android實現(xiàn)搜索本地音樂的方法

    這篇文章主要為大家詳細介紹了Android實現(xiàn)搜索本地音樂的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Android實現(xiàn)MVVM架構(gòu)數(shù)據(jù)刷新詳解流程

    Android實現(xiàn)MVVM架構(gòu)數(shù)據(jù)刷新詳解流程

    MVVM架構(gòu)模式,即Model-View-ViewModel三個層級,MVVM模式出來的時間已經(jīng)很長了,網(wǎng)上關(guān)于MVVM模式的解析也有很多,我這里只說一下我自己的理解,基本上是和MVP模式相比較的一個差異
    2021-10-10
  • android Activity線性布局和表格布局實例講解

    android Activity線性布局和表格布局實例講解

    在activity的布局中,線性布局和表格布局是最簡單的,這次分別從線性布局,表格布局以及線性布局和表格混合布局做了實驗
    2013-11-11
  • 聊聊Android中的事件分發(fā)機制

    聊聊Android中的事件分發(fā)機制

    這篇文章主要介紹了Android中的事件分發(fā)機制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下
    2021-04-04
  • kotlin使用Dagger2的過程全紀錄

    kotlin使用Dagger2的過程全紀錄

    Dagger2是一款基于Java注解,在編譯階段完成依賴注入的開源庫,主要用于模塊間解耦,方便進行測試。下面這篇文章主要給大家介紹了關(guān)于kotlin使用Dagger2的過程的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Android 更新UI的方法匯總

    Android 更新UI的方法匯總

    這篇文章主要介紹了Android 更新UI的方法匯總的相關(guān)資料, 非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • android之listview懸浮topBar效果

    android之listview懸浮topBar效果

    這篇文章主要為大家詳細介紹了android之listview懸浮topBar效果的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android自定義view實現(xiàn)滑動解鎖效果

    Android自定義view實現(xiàn)滑動解鎖效果

    這篇文章主要為大家詳細介紹了Android自定義view實現(xiàn)滑動解鎖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android實現(xiàn)類似于PC中的右鍵彈出菜單效果

    Android實現(xiàn)類似于PC中的右鍵彈出菜單效果

    這篇文章主要介紹了Android實現(xiàn)類似于PC中的右鍵彈出菜單效果,需要的朋友可以參考下
    2015-12-12
  • Android 微信小視頻錄制功能實現(xiàn)詳細介紹

    Android 微信小視頻錄制功能實現(xiàn)詳細介紹

    這篇文章主要介紹了Android 微信小視頻錄制功能實現(xiàn)詳解的相關(guān)資料,這里提供了具體的實現(xiàn)思路及代碼,需要的朋友可以參考下
    2016-11-11

最新評論