1. 程式人生 > >android讀取系統相簿返回為空的解決辦法

android讀取系統相簿返回為空的解決辦法

讀取系統相簿為空的問題,今天遇到過了,找到了解決辦法,寫出來記錄一下

關於個別手機讀取到相簿為空,可能的原因是系統版本問題,4.4系統在獲取系統返回的相簿的url的時候,有可能出現為null的問題,解決辦法來自網上

/** 
	 * Get a file path from a Uri. This will get the the path for Storage Access 
	 * Framework Documents, as well as the _data field for the MediaStore and 
	 * other file-based ContentProviders. 
	 * 
	 * @param context The context. 
	 * @param uri The Uri to query. 
	 * @author paulburke 
	 */  
	public static String getPath(final Context context, final Uri uri) {  
	  
	    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;  
	  
	    // DocumentProvider  
	    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {  
	        // ExternalStorageProvider  
	        if (isExternalStorageDocument(uri)) {  
	            final String docId = DocumentsContract.getDocumentId(uri);  
	            final String[] split = docId.split(":");  
	            final String type = split[0];  
	  
	            if ("primary".equalsIgnoreCase(type)) {  
	                return Environment.getExternalStorageDirectory() + "/" + split[1];  
	            }  
	  
	            // TODO handle non-primary volumes  
	        }  
	        // DownloadsProvider  
	        else if (isDownloadsDocument(uri)) {  
	  
	            final String id = DocumentsContract.getDocumentId(uri);  
	            final Uri contentUri = ContentUris.withAppendedId(  
	                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));  
	  
	            return getDataColumn(context, contentUri, null, null);  
	        }  
	        // MediaProvider  
	        else if (isMediaDocument(uri)) {  
	            final String docId = DocumentsContract.getDocumentId(uri);  
	            final String[] split = docId.split(":");  
	            final String type = split[0];  
	  
	            Uri contentUri = null;  
	            if ("image".equals(type)) {  
	                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;  
	            } else if ("video".equals(type)) {  
	                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;  
	            } else if ("audio".equals(type)) {  
	                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;  
	            }  
	  
	            final String selection = "_id=?";  
	            final String[] selectionArgs = new String[] {  
	                    split[1]  
	            };  
	  
	            return getDataColumn(context, contentUri, selection, selectionArgs);  
	        }  
	    }  
	    // MediaStore (and general)  
	    else if ("content".equalsIgnoreCase(uri.getScheme())) {  
	        return getDataColumn(context, uri, null, null);  
	    }  
	    // File  
	    else if ("file".equalsIgnoreCase(uri.getScheme())) {  
	        return uri.getPath();  
	    }  
	  
	    return null;  
	}  
	  
	/** 
	 * Get the value of the data column for this Uri. This is useful for 
	 * MediaStore Uris, and other file-based ContentProviders. 
	 * 
	 * @param context The context. 
	 * @param uri The Uri to query. 
	 * @param selection (Optional) Filter used in the query. 
	 * @param selectionArgs (Optional) Selection arguments used in the query. 
	 * @return The value of the _data column, which is typically a file path. 
	 */  
	public static String getDataColumn(Context context, Uri uri, String selection,  
	        String[] selectionArgs) {  
	  
	    Cursor cursor = null;  
	    final String column = "_data";  
	    final String[] projection = {  
	            column  
	    };  
	  
	    try {  
	        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,  
	                null);  
	        if (cursor != null && cursor.moveToFirst()) {  
	            final int column_index = cursor.getColumnIndexOrThrow(column);  
	            return cursor.getString(column_index);  
	        }  
	    } finally {  
	        if (cursor != null)  
	            cursor.close();  
	    }  
	    return null;  
	}  
	  
	  
	/** 
	 * @param uri The Uri to check. 
	 * @return Whether the Uri authority is ExternalStorageProvider. 
	 */  
	public static boolean isExternalStorageDocument(Uri uri) {  
	    return "com.android.externalstorage.documents".equals(uri.getAuthority());  
	}  
	  
	/** 
	 * @param uri The Uri to check. 
	 * @return Whether the Uri authority is DownloadsProvider. 
	 */  
	public static boolean isDownloadsDocument(Uri uri) {  
	    return "com.android.providers.downloads.documents".equals(uri.getAuthority());  
	}  
	  
	/** 
	 * @param uri The Uri to check. 
	 * @return Whether the Uri authority is MediaProvider. 
	 */  
	public static boolean isMediaDocument(Uri uri) {  
	    return "com.android.providers.media.documents".equals(uri.getAuthority());  
	}  


例子

			Uri uri = data.getData();
			FileInputStream fis = new FileInputStream(getPath(getBaseContext(),uri));

對獲取的到的url進行轉換,就可以避免這個問題的發生了

相關推薦

android讀取系統相簿返回解決辦法

讀取系統相簿為空的問題,今天遇到過了,找到了解決辦法,寫出來記錄一下 關於個別手機讀取到相簿為空,可能的原因是系統版本問題,4.4系統在獲取系統返回的相簿的url的時候,有可能出現為null的問題,解決辦法來自網上 /** * Get a file path fro

thinkphp5 連線 SqlServer 執行儲存過程,返回解決方案

專案做在win下,伺服器是類似空間伺服器,所以不可以裝擴充套件,只能yum 老闆又非要用雙資料庫(sqlsever 心酸里程) ,結果就是伺服器sqlsrv 不可用,裝的是dblib  ......云云雲 水準不高 ,只能用最簡單的方法 。 貼程式碼記錄一下,返回結果成功

springboot @Value獲取值,解決辦法

rtp spring val 內容 log long value cati 必須 在spring中,常常使用 @Value("${property}") 從application.properties中取值,需要註意兩點 使用 @Value 的類不能使用 new 關鍵字進

loadrunner 無響應、打不開ie瀏覽器、錄製指令碼解決辦法

打不開ie瀏覽器 或著無響應 1、檢視瀏覽器版本是否與loadrunner相容,不相容則進行版本降級。 2、開啟ie瀏覽器 工具 ——>internet選項——>高階——>去掉 啟用第三方瀏覽器擴充套件 3、開啟loadrunner 點選F4, brows

ganglia 圖片不顯示 或是 圖片內容解決辦法

在安裝ganglia的過程中發現 圖片不顯示的,當中google了baidu了,得到了不少幫助, 現在總結記錄下,當然也有適當補充下我自己的解決方法; 1)ganglia安裝好後,圖表不顯示,注意這裡是說圖表的框也沒有,就是沒有圖片; 那麼這裡估計就是rrdtool沒有配

mysqldump備份資料庫或資料表解決辦法

今天在shell中利用mysqldump備份資料庫或資料表時,發現結果檔案為空,定位很久得出結論:未找到mysqldump對應的路徑,現給出解決辦法: 1.找到mysqldump所在的路徑,linux命令:find / -name mysqldump 2.將msqldum

解決手機呼叫系統相簿返回值是null的問題

在開發專案中需要呼叫系統相簿,在別的android 手機上能正常的獲取到返回值,但是在華為上卻是返回值為null,下面請看程式碼 Intent imgIntent = new Intent(Inte

Android呼叫系統照相機返回intent原因分析

1.在呼叫android系統相簿時,使用的是如下方式:     Intent intent = new Intent(Intent.ACTION_GET_CONTENT);             intent.addCategory(Intent.CATEGORY_OPE

android開發位置應用getBestProvider返回的問題

如下程式碼片段  protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout

Android之MIUI系統BUG:呼叫拍照後不返回當前activity解決辦法

public void photo() { String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { //判斷資料夾是否存在,我的資料夾路徑是SDP

angularJs使用$q服務進行同步請求資料,解決非同步獲取資料導致return返回的問題

angularJs使用$q服務進行同步請求資料 一般angularJs中的$http進行的是非同步請求操作;在我們想要等待先請求完資料,再進行別的操作,使用這種方式,並不管用,往往請求不到資料。 a

Android-Apktool反編譯檔案解決辦法

    今天有一個Android開發同事遇到了一個問題, 他打包好的APK包給合作方使用時,對方無法通過Apktool獲取到資原始檔資訊,反編譯出來的資料夾內容為空。     網上流傳著兩個解決辦法:     1、Exception in thread main brut.

Angularjs Promise 解決非同步獲取資料導致return返回的問題

最近在開發專案的時候。我在service中請求資料返回給控制器的時候,由於資料是非同步請求的,這裡需要知道javascript的執行環境是單執行緒的,一次只能執行一個任務,但是單執行緒壞處就是如果前一個任務執行時間較長就會導致整個頁面的阻塞,因此javascript提供了

android 線上現在platforms包問題解決

target選擇列表主要對應 Android 安裝目錄下的 platforms資料夾和add-ons資料夾中的內容。由於通常解壓的Android SDK包中這兩個資料夾中的內容是空的,所以建立AVD時 

​loadrunner11腳本錄制解決方案

loadrunner11 腳本錄制 loadrunner11腳本錄制為空解決方案1. 關閉無關瀏覽器,設置IE或者火狐為默認瀏覽器;2. 錄制選項 -> Network -> 端口映射 -> 捕獲級別,修改為:socket level and winnet level data;3.

selenium中WebElement.getText()解決方法

一個 ima image too inline query star log 能夠 當使用getText()獲取一個普通的鏈接文本時: Html代碼 <a href="http://www.baidu.com">baidu</a>

requestAVAssetForVideo 取出相簿檔案

- (PHImageRequestID)requestAVAssetForVideo:(PHAsset *)asset options:(nullable PHVideoRequestOptions *)options resultHandler:(void (^)(AVAsset *_

Spring JPA Save()物件後返回該物件ID0解決辦法

springdatajpa是很好用 的一個工具,但是!首先你要會用  今天下午就被一個spring-data-jpa的問題卡了略久,因為想要用MySQL自增id,想要在save之後獲取這個儲存的實體的id進行後續的工作,一直以為springdatajpa中的save方法執行結束之後,sav

Tomcat 6.0/webapps/專案名/WEB-INF/classes下解決方案

一般啟動時說找不到該類: Tomcat 6.0/webapps/專案名/WEB-INF/classes下為空,意思是工程的所有JAVA檔案都不能生成CLASS檔案! 解決方法: MyEclipse不編譯解決1. 確保 project->build automa

一個class去獲取另一個class的static變數卻一直解決方法

java static生命週期 Static: 載入:java虛擬機器在載入類的過程中為靜態變數分配記憶體。 類變數:static變數在記憶體中只有一個,存放在方法區,屬於類變數,被所有例項所共享 銷燬:類被解除安裝時,靜態變數被銷燬,並釋放記憶體空間。static變數的生命週期取決