2014-10-27 26 views
0

你好,這是我的代碼:德爾福Firemonkey的Android獲得通話記錄錯誤

function FetchCalls:string; 
var 
    cursor: JCursor; 
    uri: Jnet_Uri; 
CACHED_FORMATTED_NUMBER, CACHED_LOOKUP_URI, CACHED_MATCHED_NUMBER, CACHED_NAME, 
CACHED_NORMALIZED_NUMBER, CACHED_NUMBER_LABEL, CACHED_NUMBER_TYPE, CACHED_PHOTO_ID, 
CONTENT_ITEM_TYPE, CONTENT_TYPE, COUNTRY_ISO, DATA_USAGE, DATE, DEFAULT_SORT_ORDER, DURATION, 
EXTRA_CALL_TYPE_FILTER, FEATURES, IS_READ, LIMIT_PARAM_KEY, NEW, NUMBER, NUMBER_PRESENTATION, 
OFFSET_PARAM_KEY, PHONE_ACCOUNT_COMPONENT_NAME, PHONE_ACCOUNT_ID, TRANSCRIPTION, TYPEX, VOICEMAIL_URI : integer; 

    msgunixtimestampms:int64; 
CACHED_FORMATTED_NUMBERx, CACHED_LOOKUP_URIx, CACHED_MATCHED_NUMBERx, CACHED_NAMEx, 
CACHED_NORMALIZED_NUMBERx, CACHED_NUMBER_LABELx, CACHED_NUMBER_TYPEx, CACHED_PHOTO_IDx, 
CONTENT_ITEM_TYPEx, CONTENT_TYPEx, COUNTRY_ISOx, DATA_USAGEx, DATEx, DEFAULT_SORT_ORDERx, DURATIONx, 
EXTRA_CALL_TYPE_FILTERx, FEATURESx, IS_READx, LIMIT_PARAM_KEYx, NEWx, NUMBERx, NUMBER_PRESENTATIONx, 
OFFSET_PARAM_KEYx, PHONE_ACCOUNT_COMPONENT_NAMEx, PHONE_ACCOUNT_IDx, TRANSCRIPTIONx, TYPEXx, VOICEMAIL_URIx : string; 
begin 
    uri:=StrToJURI('content://call_log/calls'); 
    cursor := SharedActivity.getContentResolver.query(uri, nil, nil,nil,nil); 
    CACHED_FORMATTED_NUMBER:=cursor.getColumnIndex(StringToJstring('CACHED_FORMATTED_NUMBER')); 
    CACHED_LOOKUP_URI:=cursor.getColumnIndex(StringToJstring('CACHED_LOOKUP_URI')); 
    CACHED_MATCHED_NUMBER:=cursor.getColumnIndex(StringToJstring('CACHED_MATCHED_NUMBER')); 
    CACHED_NAME:=cursor.getColumnIndex(StringToJstring('CACHED_NAME')); 
    CACHED_NORMALIZED_NUMBER:=cursor.getColumnIndex(StringToJstring('CACHED_NORMALIZED_NUMBER')); 
    CACHED_NUMBER_LABEL:=cursor.getColumnIndex(StringToJstring('CACHED_NUMBER_LABEL')); 
    CACHED_NUMBER_TYPE:=cursor.getColumnIndex(StringToJstring('CACHED_NUMBER_TYPE')); 
    CACHED_PHOTO_ID:=cursor.getColumnIndex(StringToJstring('CACHED_PHOTO_ID')); 
    CONTENT_ITEM_TYPE:=cursor.getColumnIndex(StringToJstring('CONTENT_ITEM_TYPE')); 
    CONTENT_TYPE:=cursor.getColumnIndex(StringToJstring('CONTENT_TYPE')); 
    COUNTRY_ISO:=cursor.getColumnIndex(StringToJstring('COUNTRY_ISO')); 
    DATA_USAGE:=cursor.getColumnIndex(StringToJstring('DATA_USAGE')); 
    DATE:=cursor.getColumnIndex(StringToJstring('DATE')); 
    DEFAULT_SORT_ORDER:=cursor.getColumnIndex(StringToJstring('DEFAULT_SORT_ORDER')); 
    DURATION:=cursor.getColumnIndex(StringToJstring('DURATION')); 
    EXTRA_CALL_TYPE_FILTER:=cursor.getColumnIndex(StringToJstring('EXTRA_CALL_TYPE_FILTER')); 
    FEATURES:=cursor.getColumnIndex(StringToJstring('FEATURES')); 
    IS_READ:=cursor.getColumnIndex(StringToJstring('IS_READ')); 
    LIMIT_PARAM_KEY:=cursor.getColumnIndex(StringToJstring('LIMIT_PARAM_KEY')); 
    NEW:=cursor.getColumnIndex(StringToJstring('NEW')); 
    NUMBER:=cursor.getColumnIndex(StringToJstring('NUMBER')); 
    NUMBER_PRESENTATION:=cursor.getColumnIndex(StringToJstring('NUMBER_PRESENTATION')); 
    OFFSET_PARAM_KEY:=cursor.getColumnIndex(StringToJstring('OFFSET_PARAM_KEY')); 
    PHONE_ACCOUNT_COMPONENT_NAME:=cursor.getColumnIndex(StringToJstring('PHONE_ACCOUNT_COMPONENT_NAME')); 
    PHONE_ACCOUNT_ID:=cursor.getColumnIndex(StringToJstring('PHONE_ACCOUNT_ID')); 
    NUMBER_PRESENTATION:=cursor.getColumnIndex(StringToJstring('NUMBER_PRESENTATION')); 
    TRANSCRIPTION:=cursor.getColumnIndex(StringToJstring('TRANSCRIPTION')); 
    TYPEX:=cursor.getColumnIndex(StringToJstring('TYPE')); 
while (cursor.moveToNext) do begin 
    CACHED_FORMATTED_NUMBERx:=JStringToString(cursor.getString(CACHED_FORMATTED_NUMBER)); 
    CACHED_LOOKUP_URIx:=JStringToString(cursor.getString(CACHED_LOOKUP_URI)); 
    CACHED_MATCHED_NUMBERx:=JStringToString(cursor.getString(CACHED_MATCHED_NUMBER)); 
    CACHED_NAMEx:=JStringToString(cursor.getString(CACHED_NAME)); 
    CACHED_NORMALIZED_NUMBERx:=JStringToString(cursor.getString(CACHED_NORMALIZED_NUMBER)); 
    CACHED_NUMBER_LABELx:=JStringToString(cursor.getString(CACHED_NUMBER_LABEL)); 
    CACHED_NUMBER_TYPEx:=JStringToString(cursor.getString(CACHED_NUMBER_TYPE)); 
    CACHED_PHOTO_IDx:=JStringToString(cursor.getString(CACHED_PHOTO_ID)); 
    CONTENT_ITEM_TYPEx:=JStringToString(cursor.getString(CONTENT_ITEM_TYPE)); 
    CONTENT_TYPEx:=JStringToString(cursor.getString(CONTENT_TYPE)); 
    COUNTRY_ISOx:=JStringToString(cursor.getString(COUNTRY_ISO)); 
    DATA_USAGEx:=JStringToString(cursor.getString(DATA_USAGE)); 
    DATEx:=JStringToString(cursor.getString(DATE)); 
    DEFAULT_SORT_ORDERx:=JStringToString(cursor.getString(DEFAULT_SORT_ORDER)); 
    DURATIONx:=JStringToString(cursor.getString(DURATION)); 
    EXTRA_CALL_TYPE_FILTERx:=JStringToString(cursor.getString(EXTRA_CALL_TYPE_FILTER)); 
    FEATURESx:=JStringToString(cursor.getString(FEATURES)); 
    IS_READx:=JStringToString(cursor.getString(IS_READ)); 
    LIMIT_PARAM_KEYx:=JStringToString(cursor.getString(LIMIT_PARAM_KEY)); 
    NEWx:=JStringToString(cursor.getString(NEW)); 
    NUMBERx:=JStringToString(cursor.getString(NUMBER)); 
    NUMBER_PRESENTATIONx:=JStringToString(cursor.getString(NUMBER_PRESENTATION)); 
    OFFSET_PARAM_KEYx:=JStringToString(cursor.getString(OFFSET_PARAM_KEY)); 
    PHONE_ACCOUNT_COMPONENT_NAMEx:=JStringToString(cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME)); 
    PHONE_ACCOUNT_IDx:=JStringToString(cursor.getString(PHONE_ACCOUNT_ID)); 
    NUMBER_PRESENTATIONx:=JStringToString(cursor.getString(NUMBER_PRESENTATION)); 
    TRANSCRIPTIONx:=JStringToString(cursor.getString(TRANSCRIPTION)); 
    TYPEXx:=JStringToString(cursor.getString(TYPEX)); 
    Result:=TYPEXx+CACHED_NAMEx+NUMBERx; 
    end; 
end; 

,並使用... 這裏是使用方法

Memo1.lines.add(FetchCalls);

但是,當我嘗試使用這個功能我得到這個錯誤:

「JAVA.LANG.LLLEGALSTATEEXCEPTION:無法讀取列0,-1 COL從CURSORWINDOW確保光標被正確初始化之前訪問。數據不是這樣。

任何想法如何解決這個問題??

非常感謝你

+0

首先要檢查:您是否在應用清單中指定了READ_CALL_LOG權限? – Deltics 2014-10-27 19:29:47

+0

是的,權限是好的。 – 2014-10-27 19:33:32

+0

另一個想法?非常感謝 – 2014-10-27 21:12:28

回答

1

我解決你的問題,這是非常好的代碼誰我用來複制和固定完全相同的錯誤,您有。 首先包括

Androidapi.JNI.Provider, FMX.Helpers.Android 

根據你的delphi版本。在我的情況下,我使用Delphi 10.1柏林。

二取代所有

cursor.getColumnIndex(StringToJstring('XXXX')); 

cursor.getColumnIndex(TJCallLog_Calls.JavaClass.XXXX); 

爲例進行CACHED_NAME它將編譯一切後

CACHED_NAME:=cursor.getColumnIndex(TJCallLog_Calls.JavaClass.CACHED_NAME); 

,它的工作就好了。我會給你的另一個建議是評論或刪除你提取的數據但你不使用。在代碼結束時,您只返回TYPE,CACHED_NAME和NUMER。從其他字段獲取數據的所有其他調用都是不必要的。