2015-06-04 42 views
1

當我使用cordova函數resolveLocalFileSystemURL與某些類型的文件uri(如content://com.android.providers.downloads.documents/document/some_doc)我有代碼1000錯誤。我使用智能手機上安裝的cordova 5.1和5版本的Android。科爾多瓦resolveLocalFileSystemURL在Android中的錯誤代碼爲1000

亞行logcat表明這一點:

W/System.err(28721): java.lang.NullPointerException: Attempt to invoke virtual method 'long java.lang.Long.longValue()' on a null object reference 
W/System.err(28721): at org.apache.cordova.file.ContentFilesystem.getFileMetadataForLocalURL(ContentFilesystem.java:130) 
W/System.err(28721): at org.apache.cordova.file.Filesystem.exists(Filesystem.java:130) 
W/System.err(28721): at org.apache.cordova.file.FileUtils.resolveLocalFileSystemURI(FileUtils.java:624) 
W/System.err(28721): at org.apache.cordova.file.FileUtils.access$400(FileUtils.java:51) 
W/System.err(28721): at org.apache.cordova.file.FileUtils$14.run(FileUtils.java:383) 
W/System.err(28721): at org.apache.cordova.file.FileUtils$25.run(FileUtils.java:566) 
W/System.err(28721): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
W/System.err(28721): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
W/System.err(28721): at java.lang.Thread.run(Thread.java:818) 

是它的一些方式來打開這個科爾多瓦文件?

回答

2

我修復了這個問題。在Android 5中,遊標現在是DocumentCursor而不是Media Cursor,這意味着它正在尋找錯誤的列。當找不到該列時,該插件嘗試將一個長爲null的基元設置爲null,從而導致NullPointerException。

@Override 
public JSONObject getFileMetadataForLocalURL(LocalFilesystemURL inputURL) throws FileNotFoundException { 
    long size = -1; 
    long lastModified = 0; 
    Uri nativeUri = toNativeUri(inputURL); 
    String mimeType = resourceApi.getMimeType(nativeUri); 
    Cursor cursor = openCursorForURL(nativeUri); 
    try { 
     if (cursor != null && cursor.moveToFirst()) { 
      size = resourceSizeForCursor(cursor); 
      Long modified = lastModifiedDateForCursor(cursor); 
      if (modified != null) 
       lastModified = modified.longValue(); 
     } else { 
      // Some content providers don't support cursors at all! 
      CordovaResourceApi.OpenForReadResult offr = resourceApi.openForRead(nativeUri); 
      size = offr.length; 
     } 
    } catch (IOException e) { 
     throw new FileNotFoundException(); 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 

    JSONObject metadata = new JSONObject(); 
    try { 
     metadata.put("size", size); 
     metadata.put("type", mimeType); 
     metadata.put("name", name); 
     metadata.put("fullPath", inputURL.path); 
     metadata.put("lastModifiedDate", lastModified); 
    } catch (JSONException e) { 
     return null; 
    } 
    return metadata; 
} 

protected Long lastModifiedDateForCursor(Cursor cursor) { 
    int columnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DATE_MODIFIED); 
    if (columnIndex == -1) { 
     columnIndex = cursor.getColumnIndex(DocumentsContract.Document.COLUMN_LAST_MODIFIED); 
    } 
    if (columnIndex != -1) { 
     String dateStr = cursor.getString(columnIndex); 
     if (dateStr != null) { 
      return Long.parseLong(dateStr); 
     } 
    } 
    return null; 
} 
+0

我有完全相同的問題。當你說你已經解決了這個問題時,你的意思是現在是在當前版本的cordova v5.1.1中? – Kevin

+1

我分叉了github項目並提交了一個pull請求。仍然沒有被拉。但是,文件插件和Android 5還有很多其他問題。我還沒有弄清楚其他問題。 –

相關問題