2014-02-10 1 views
0

Я разработал приложение, которое обращается события календаря, журналы вызовов и входящие сообщения, используя такие вещи, как это:Существует ли стандартный способ доступа к событиям календаря, журналам вызовов и сообщениям входящих сообщений?

cursor = this.contentResolver.query(CallLog.Calls.CONTENT_URI, projection, selection, null, order); 

Приложение отлично работает в Galaxy SII, но когда я установил его в XPERIA U это не работал, вероятно, потому, что этот телефон управляет календарями, звонками и сообщениями по-другому. Если мне нужно разработать приложение для каждого телефона в мире, это не очень хороший бизнес. Я пробовал некоторые классы Android, такие как CalendarContract.Events, но его уровень API слишком тяжелый, и я не хочу этого, потому что он не будет работать в большинстве телефонов. Есть ли хороший стандартный способ для этого, который работает на большом количестве устройств? Спасибо!

package bembibre.coolstar.windowsmobilewidget.backend; 

import java.util.ArrayList; 
import java.util.List; 

import bembibre.coolstar.windowsmobilewidget.apiindependent.ApiIndependentCallLog; 

import android.content.ContentResolver; 
import android.content.Context; 
import android.database.Cursor; 
import android.provider.CallLog; 
import android.util.Log; 

public class CallsContentResolver { 
public static final String[] projection = { 
    CallLog.Calls.CACHED_NAME, 
    CallLog.Calls.DATE, 
}; 

public static final String selection = "((" + CallLog.Calls.TYPE + " = " + 
CallLog.Calls.MISSED_TYPE + ") AND NOT(" + 
ApiIndependentCallLog.instance().CALLS_IS_READ + "))"; 

private static final int MAX_NUM_CALLS = 3; 

private static final String order = CallLog.Calls.DATE + " DESC LIMIT " + MAX_NUM_CALLS; 

private ContentResolver contentResolver; 

public CallsContentResolver(Context ctx) { 
    this.contentResolver = ctx.getContentResolver(); 
} 

public void readCursor(List<Call> calls, Cursor cursor){ 
    while (cursor.moveToNext()) { 
     String cached_name = cursor.getString(cursor.getColumnIndex(
      CallLog.Calls.CACHED_NAME) 
     ); 

     long date = cursor.getLong(cursor.getColumnIndex(
      CallLog.Calls.DATE) 
     ); 

     Call call = new Call(cached_name, date); 
     calls.add(0, call); 
    } 
} 

public List<Call> getMissedCalls(){ 
    List<Call> calls = new ArrayList<Call>(); 
    Cursor cursor = null; 

    try{ 
     cursor = this.contentResolver.query(CallLog.Calls.CONTENT_URI, projection, selection, null, order); 
     if(cursor.getCount() > 0) { 
      this.readCursor(calls, cursor); 
     } 
    } 
    catch(Exception e){ 
     Log.d("EXCEPCIÓN", e.getMessage()); 
    } 
    finally{ 
     if(cursor != null){ 
      cursor.close(); 
     } 
    } 

    return calls; 
} 
} 

ответ

1
+0

я разработал свой код на основе Календаря поставщика и Контакты поставщика. Он работает на Galaxy S2, но не работает на XPeria U. Почему? Оба являются телефонами Android, и мои минимальные требования к уровню API выше, чем уровень API в XPeria U. – user3289695

+0

Очень странно, ContentProviders - стандартный способ, тестирование на других устройствах. – alfdev

+0

Когда я получаю пропущенный вызов в Галактике, ContentResolver, который я получаю таким образом: 'context.getContentResolver();', дает мне вызов, запрашивая базу данных. Но в Xperia эта база данных всегда пуста, независимо от количества пропущенных вызовов, которые у меня есть. Если каждый телефон использует другую базу данных, как я могу создать приложение, которое работает в широком диапазоне телефонов Android? Извините, я начинающий Android-программист. – user3289695

0

Вы можете получить событие каландра из этого запроса, в котором

long after = date.getTime(); 
long current = new Date().getTime(); 
long millisOfOne = 1000; 
long millisOftwoFour = 1000 * 60 * 60 * 24; 

long millisOfTodayLast = date.getTime() + millisOftwoFour 
       - millisOfOne; 



Cursor cursor = context.getContentResolver().query(Uri.parse("content://com.android.calendar/events"),new String[] { "calendar_id", "title", "description","dtstart", "dtend", "eventLocation", "_id" },"dtstart >=" + after + " and dtstart<" + millisOfTodayLast, 
      null, "dtstart ASC"); 
+0

Я сделал именно то, что вы говорите. Отлично работает на Galaxy S2, но не работает на XPeria U. Я не понимаю. Уровень API для XPeria достаточно для его запуска, но когда я хочу извлечь календарные события или вызовы из баз данных Android, исключаются исключения, говоря такие вещи, как «Я вне диапазона» или «этот столбец не существует» ... Должны ли те же имена Android, имена таблиц и столбцов совпадать во всех телефонах? Кажется, что это не так. – user3289695

+0

, если настройка, сделанная вашим телефоном, может отличаться для имени этого устройства; поэтому вы должны использовать свое имя пакета специально. Эта кодировка работает на большинстве Android-устройств, у которых ОС ядра Android и настройка не выполняются с использованием класса календаря. – KDOSHI

+0

Это означает, что у SONY есть свои приложения для календаря и журналов вызовов без использования тех, которые предлагает Android? Тогда программирование приложения для всех телефонов - это кошмар ... Я отлаживал свой код, чтобы проверить, например, почему в XPeria UI не удается восстановить пропущенные вызовы в моем приложении, и кажется, что XPeria U хранит вызовы по-другому, чем Галактика S2. – user3289695

Смежные вопросы