Намерение, предоставленное курсором, не выполняется правильно (LiveFolders) - PullRequest
3 голосов
/ 15 апреля 2010

В отчаянии, пытаясь заставить LiveFolders работать, я попробовал следующее в моем LiveFolder ContentProvider:

public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    MatrixCursor mc = new MatrixCursor(new String[] { LiveFolders._ID, LiveFolders.NAME, LiveFolders.INTENT } );
    Intent i = null;

    for (int j=0; j < 5; j++) {
        i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/"));
        mc.addRow(new Object[] { j, "hello", i} );
    }

    return mc;
}

Что, как правило, должно запускать браузер и отображать главную страницу Google при нажатии на элемент в LiveFolder. Но это не так. Это дает ошибку Application is not installed on your phone. Нет, я не определяю базовое намерение для моего LiveFolder.

logcat говорит:

I/ActivityManager(   74): Starting activity: Intent { act=android.intent.action.VIEW dat=Intent { act=android.intent.action.VIEW dat=http://www.google.com/ } flg=0x10000000 }

Кажется, он встраивает Intent, который я даю, в секцию data фактически запущенного Intent. Почему он это делает? Я действительно начинаю верить, что это ошибка платформы.


Обновление: Я подал проблему и удалил функцию LiveFolders. Я включу его в свое приложение, когда получу ответ, здесь или там, который проясняет эту вещь. Если у меня будет время, я думаю, что загружу демонстрационное приложение для этой проблемы.


Обновление: Я получил уведомление о том, что срок действия вознаграждения истекает через 3 дня. Никто не хочет этого? :)


Обновление 25.04.2010: Я обновил проблему в проекте Android и загрузил тестовое приложение. Было бы неплохо, если бы кто-то мог протестировать это приложение на устройстве, возможно, это такая тонкая проблема, что она появляется только в эмуляторе.

Ответы [ 3 ]

1 голос
/ 04 июня 2010

я сталкиваюсь с тем же; и может, к сожалению, подтвердить это: намерение заключено в часть данных намерения, которое должно быть запущено.

Мне интересно, правильно ли вычисляются другие предопределенные CURSOR-столбцы; Я думал о том, чтобы сообщить об ошибке для случая, когда должны быть возвращены пользовательские значки (для каждой записи, а не одна для всех); но не удалось. Во всей сети я не нашел ни одного примера или человека, который бы успешно использовал эти столбцы; кажется, что работают только имя и идентификатор.

Это одна из основных функций Android для USP, и, похоже, ее просто не приняли.

1 голос
/ 16 сентября 2011

У меня тоже похожая проблема. Я думаю, это потому, что когда Курсор отправляет свои данные на CursorWindow в fillWindow, он может только putBlob, putString, putLong и т. Д. Я не уверен, как действительный объект Bitmap (ICON_BITMAP ) или объект Intent (INTENT) может быть передан. MatrixCursor сделает .toString() для любого объекта. На объекте Intent будет что-то вроде: "Intent { act=android.intent.action.EDIT dat=URI }". Я не думаю, что система правильно интерпретирует это обратно к правильному URI.

Я пытался сериализовать намерение в putBlob, но намерение не сериализуемо. То, что я получил для работы, это просто передача URI в качестве поля Intent. Это только дает вам действие по умолчанию для определенного URI, но работает. У меня также возникает проблема, когда, если я укажу «null» для Intent, то это тоже ошибка, даже если я укажу EXTRA_LIVE_FOLDER_BASE_INTENT. Если я вообще не указываю поле в курсоре, базовое намерение работает, но если я укажу поле как нулевое, оно потерпит неудачу. Кажется, он не отступает от базового намерения.

Надеюсь, это поможет ...

0 голосов
/ 25 апреля 2010

Можете ли вы попробовать жестко закодировать имя компонента.

Intent intent = new Intent();
ComponentName comp = new ComponentName("com.google.android.browser",
                                   "com.google.android.browser.BrowserActivity");
intent.setComponent(comp);
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.BROWSABLE");
Uri uri = Uri.parse(url);
intent.setData(uri); 
...