Урок 31. Зачем у Intent есть атрибут data. Что такое Uri. Вызываем системные приложения

Обсуждение уроков
samarjan
Сообщения: 27
Зарегистрирован: 01 авг 2012, 13:56

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение samarjan » 27 авг 2012, 16:27

НЕ подскажите как вызвать просмотр файлов(желательно картинок) для того чтобы выбрать картинку и получить к ней адресс?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение rezak90 » 27 авг 2012, 16:51

samarjan писал(а):НЕ подскажите как вызвать просмотр файлов(желательно картинок) для того чтобы выбрать картинку и получить к ней адресс?
IntentFilter тебе в помощь.
R.id.team
Политика на форуме запрещена

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение KamiSempai » 27 авг 2012, 20:40

rezak90 писал(а):IntentFilter тебе в помощь.
Просто дьявольски помог :)

Файл можно открыть так:

Код: Выделить всё

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, 0);
И в самом Activity переопределить:

Код: Выделить всё

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(data!=null){
        String path = data.getData().getPath();
        // Делаем что-то с файлом...
    }
}
С картинакми там какие-то непонятные заморочки, выдает не совсем тот путь который в действительности.
То ли интент надо как-то по другому оформлять, то ли результат обрабатывать по другому.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение KamiSempai » 27 авг 2012, 20:59

Действительно по другому обрабатывать.
Как-то так:

Код: Выделить всё

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), data.getData());
Естественно, для картинок, в intent.setType нужно передать "image/*"

PS: Все так сложно... Если углубляться в тему, хватит еще, минимум, на пару уроков.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение AndreyI » 27 авг 2012, 22:32

Есть вроде готовые решения http://russenreaktor.wordpress.com/2010 ... ery-image/
managedQuery() устаревший, есть другое решение для нахождения пути к картинке по URI

private String getRealPathFromURI(Uri contentURI) {
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(idx);
}

Но тут одна тонкость, все это работает когда пользователь использует "Галерею" для выбора картинки, но реально в списке приложений, предложенном системой, могут присутствовать и файлменеджеры, которые также обрабатывают “image/*” но они возвращают путь и не факт, что пользователь всегда будет выбирать галерею.

Т.е. нужно предусмотреть проверку содержимого возвращаемого URI, либо как-то ограничить chooser только галереей.
Да и курсор нужно явно закрывать после использования (во всяком случае так пишут в доках).
В общем, код предложенный по ссылке требует доработки.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение dil_android » 22 сен 2012, 17:10

Здравствуйте,
если попытаться описать словами наш код, то получится так: этот Intent означает, что мы хотим посмотреть содержимое этой ссылки и ищем Activity, которая могла бы нам помочь.
Хотелось бы прояснить в части, связанной с системными приложениями. Используя атрибут action для совершения какого-то действия над объектом и, посредством data, указывая на объект (и его вид), над которым нужно произвести это действие, мы вызываем конкретное Activity, которое может произвести это действие или вызываем непосредственно системное приложение, у которого кроме этого Activity есть еще много других, но в данном конкретном случае не нужных?

Например: есть стандартный браузер, который имеет расширенный функционал, состоящий из нескольких Activity. На основе примера в 32-ом уроке я хочу написать свой вариант браузера, в котором я хочу использовать только одну функцию стандартного браузера, для которой уже есть своя Activity. Как это сделать?

Что можно почитать (кроме developers guide), чтобы лучше понять как осуществляется доступ к системным приложениям в Android.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение dil_android » 23 сен 2012, 16:32

Здравствуйте,

можно ли в Android создавать новый Java класс, который будет являться подклассом MainActivity.
public class MyJavaClass extends MainActivity
Если да, то какие пакеты импортируются, и есть ли какие-либо нюансы этого дела.

Спасибо.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение damager82 » 24 сен 2012, 13:19

dil_android писал(а):можно ли в Android создавать новый Java класс, который будет являться подклассом MainActivity.
public class MyJavaClass extends MainActivity
Если да, то какие пакеты импортируются, и есть ли какие-либо нюансы этого дела.
Можно. Например в MainActivity прописываете какой-то функционал, общий для всех Activity, и все следующие Activity делаете наследниками, чтобы не писать одно и то же несколько раз. Нюансов вроде как нет особых.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение damager82 » 24 сен 2012, 13:21

dil_android писал(а):Используя атрибут action для совершения какого-то действия над объектом и, посредством data, указывая на объект (и его вид), над которым нужно произвести это действие, мы вызываем конкретное Activity, которое может произвести это действие или вызываем непосредственно системное приложение, у которого кроме этого Activity есть еще много других, но в данном конкретном случае не нужных?
Фильтры с action и data прописаны для Activity. Соответственно, вызывается именно Activity, а не все приложение.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение dil_android » 27 сен 2012, 06:34

Спасибо большое за разъяснение.

Чтобы закрыть тему и двигаться дальше, хочу спросить: получается, что вызов конкретного Activity для совершения действия над объектом осуществляется только при помощи Intent (data)? Не сужает ли это возможности оперирования собственными и чужими Activity?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение damager82 » 28 сен 2012, 12:53

dil_android писал(а):Не сужает ли это возможности оперирования собственными и чужими Activity?
А каких возможностей оперирования не хватает в текущей парадигме?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение dil_android » 28 сен 2012, 22:13

Насколько я понял "в качестве дата мы подаем объект Uri", т.е. все Активити работают только с тем типом данных, который описывается Uri. Я не специалист, но прочитав про Uri в Wiki задался вопросом: включает ли Uri описание абсолютно всех типов данных?

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение dil_android » 29 сен 2012, 05:03

Intent, позволяя обращаться к собственным или чужим Activity для решения задач с определенным типом данных, не позволяет вам каким либо образом модифицировать Activity, или любым другим образом воздействовать на него. Так ли это? Есть ли у Androida соответствующий функционал, и если да, то можно пример.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение damager82 » 02 окт 2012, 10:09

dil_android писал(а):Intent, позволяя обращаться к собственным или чужим Activity для решения задач с определенным типом данных, не позволяет вам каким либо образом модифицировать Activity, или любым другим образом воздействовать на него. Так ли это? Есть ли у Androida соответствующий функционал, и если да, то можно пример.
Не позволяет. Также и в программировании. Вы не можете изменить вызываемый метод. Только что-то передать на вход и получить результат.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение dil_android » 02 окт 2012, 15:23

Понял, спасибо.

ipona
Сообщения: 7
Зарегистрирован: 04 окт 2012, 14:50

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение ipona » 04 окт 2012, 15:06

Как сделать чтобы сразу шел вызов номера?

Код: Выделить всё

  public void onClick(View v) {
    Intent intent;
    switch (v.getId()) {
    case R.id.btnCall:
    	   intent = new Intent(Intent.ACTION_CALL);
    	      intent.setData(Uri.parse("tel:+7123456"));
    	      startActivity(intent);
      break;
    }
Не работает, почему?
Помогите плз.

ensto
Сообщения: 3
Зарегистрирован: 04 окт 2012, 23:04
Контактная информация:

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение ensto » 04 окт 2012, 23:09

ipona писал(а):Как сделать чтобы сразу шел вызов номера?
В файле манифеста приложения, на вкладке Permission добавьте элемент Uses Permission и справа в поле Name выберите:
android.permission.CALL_PHONE

ipona
Сообщения: 7
Зарегистрирован: 04 окт 2012, 14:50

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение ipona » 05 окт 2012, 07:39

Большое спасибо! Работает как надо!

olegyershov
Сообщения: 1
Зарегистрирован: 15 окт 2012, 15:32

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение olegyershov » 15 окт 2012, 15:38

damager82 писал(а):
А вот интересно, что будет если не окажется ни одного обработчика? приложение с грохотом упадёт? Как это лучше обрабатывать?
стандартный try-catch:

Код: Выделить всё

try {
   intent = new Intent();
   intent.setAction(Intent.ACTION_VIEW);
   intent.setData(Uri.parse("geo:55.754283,37.62002"));
   startActivity(intent);
} catch (Exception ex) {
   Toast.makeText(this, ex.getMessage(), 0).show();
}

Step
Сообщения: 2
Зарегистрирован: 20 окт 2012, 17:10

Re: Урок 31. Зачем у Intent есть атрибут data. Что такое Uri

Сообщение Step » 20 окт 2012, 17:32

Здравствуйте,

У меня не работает интернет в эмуляторе, как в браузере, так и в приложении этого урока. Как можно это настроить? Может это связано с тем, что у меня 2 сетевые карты? На всякий случай прилагаю логи, там есть сообщение "нажата кнопка web", после которой ничего не работает. Пожалуйста помогите, я новичок во всем этом. Антивирус предварительно отключил. Поиск в интернетах ответа не дал.

10-20 14:23:22.551: D/myLogs(376): Нажата кнопка WEB
10-20 14:23:22.560: I/ActivityManager(62): Starting: Intent { act=android.intent.action.VIEW dat=http://developer.android.com cmp=com.android.browser/.BrowserActivity } from pid 376
10-20 14:23:22.660: I/ActivityManager(62): Start proc com.android.browser for activity com.android.browser/.BrowserActivity: pid=385 uid=10033 gids={3003, 1015}
10-20 14:23:23.120: I/ActivityThread(385): Pub browser: com.android.browser.BrowserProvider
10-20 14:23:23.250: I/BrowserSettings(385): Selected search engine: ActivitySearchEngine{android.app.SearchableInfo@40598538}
10-20 14:23:23.551: D/dalvikvm(385): GC_CONCURRENT freed 449K, 50% free 2919K/5831K, external 766K/1038K, paused 4ms+4ms
10-20 14:23:23.981: I/ActivityManager(62): Displayed com.android.browser/.BrowserActivity: +1s328ms
10-20 14:23:31.960: E/CheckinTask(203): Checkin failed: https://android.clients.google.com/checkin (request #0)
10-20 14:23:31.960: E/CheckinTask(203): java.net.UnknownHostException: android.clients.google.com
10-20 14:23:31.960: E/CheckinTask(203): at java.net.InetAddress.lookupHostByName(InetAddress.java:506)
10-20 14:23:31.960: E/CheckinTask(203): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:294)
10-20 14:23:31.960: E/CheckinTask(203): at java.net.InetAddress.getAllByName(InetAddress.java:256)
10-20 14:23:31.960: E/CheckinTask(203): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
10-20 14:23:31.960: E/CheckinTask(203): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
10-20 14:23:31.960: E/CheckinTask(203): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
10-20 14:23:31.960: E/CheckinTask(203): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
10-20 14:23:31.960: E/CheckinTask(203): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
10-20 14:23:31.960: E/CheckinTask(203): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
10-20 14:23:31.960: E/CheckinTask(203): at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:248)
10-20 14:23:31.960: E/CheckinTask(203): at com.google.android.common.http.GoogleHttpClient.executeWithoutRewriting(GoogleHttpClient.java:203)
10-20 14:23:31.960: E/CheckinTask(203): at com.google.android.common.http.GoogleHttpClient.execute(GoogleHttpClient.java:245)
10-20 14:23:31.960: E/CheckinTask(203): at com.google.android.common.http.GoogleHttpClient.execute(GoogleHttpClient.java:313)
10-20 14:23:31.960: E/CheckinTask(203): at com.google.android.gsf.checkin.CheckinTask.sendRequest(CheckinTask.java:254)
10-20 14:23:31.960: E/CheckinTask(203): at com.google.android.gsf.checkin.CheckinTask.doInBackground(CheckinTask.java:150)
10-20 14:23:31.960: E/CheckinTask(203): at com.google.android.gsf.checkin.CheckinService$1.doInBackground(CheckinService.java:221)
10-20 14:23:31.960: E/CheckinTask(203): at com.google.android.gsf.checkin.CheckinService$1.doInBackground(CheckinService.java:214)
10-20 14:23:31.960: E/CheckinTask(203): at android.os.AsyncTask$2.call(AsyncTask.java:185)
10-20 14:23:31.960: E/CheckinTask(203): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
10-20 14:23:31.960: E/CheckinTask(203): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
10-20 14:23:31.960: E/CheckinTask(203): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
10-20 14:23:31.960: E/CheckinTask(203): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
10-20 14:23:31.960: E/CheckinTask(203): at java.lang.Thread.run(Thread.java:1019)
10-20 14:23:32.140: D/dalvikvm(203): GC_CONCURRENT freed 578K, 51% free 2984K/6023K, external 716K/1038K, paused 4ms+5ms
10-20 14:23:44.860: E/Tab(385): onReceivedError -2 http://developer.android.com/ Не удалось найти URL.
10-20 14:24:56.700: W/KeyCharacterMap(385): No keyboard for id 0
10-20 14:24:56.700: W/KeyCharacterMap(385): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
10-20 14:24:56.841: W/InputManagerService(62): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@40637608 (uid=10033 pid=385)
10-20 14:24:57.140: D/webviewglue(385): nativeDestroy view: 0x294ec8
10-20 14:25:05.130: D/dalvikvm(385): GC_EXPLICIT freed 225K, 49% free 3014K/5831K, external 948K/1038K, paused 49ms
: E/(): Device disconnected

Ответить