Как использовать unix pipe в Android - PullRequest
9 голосов
/ 17 мая 2011

Мне нужно отправить некоторые данные на C-программу из моего приложения в Android, и я думаю об использовании каналов.Я прочитал, что Java может получить доступ к существующим каналам (и открыть их, как будто это обычный файл), но я не могу сделать такую ​​вещь в своем приложении.Когда я пытаюсь, приложение просто блокируется, пока не появится сообщение «ожидание закрытия», не написав ничего особенного в logcat.

Я обнаружил ветку в списках рассылки Android на эту тему, но это не такочень ясно, и это относится к папке, которая не существует на моем телефоне.

Кроме того, я знаю, что невозможно создать каналы на SD-карте, но когда я пытаюсь сделать это в /data, якажется, у меня есть проблемы с корнем ... Знаете ли вы, возможно ли получить доступ к этому каналу (я безуспешно пытаюсь войти и выйти из папки приложения)?Кажется, ОК, чтобы быть открытым для любого пользователя.

prw-rw-rw- root     root              2010-11-18 04:53 video_pipe

Я пытался добавить разрешение X (кто знает ...) Вот что я вернулся:

# chmod u+x video_pipe 
Bad mode

Кодэтот блок - инициализация камеры (PATH - это просто путь к каналу):

recorder.setOutputFile(PATH);

Вот весь источник: https://github.com/rbochet/Simple-Camera-App/commits/piped (commit * 1027)* 22dba257f6 )

Ответы [ 2 ]

9 голосов
/ 18 мая 2011

Хорошо, я попытался исправить проблему с самым глупым из существующих приложений.Вы можете найти этот в виде гистограммы на github .

. До сих пор я обнаружил это:

  • Единственное место, где работает канал, - это папка приложения.(т. е. /data/data/package.full.name/)
  • Если вы хотите передать данные в другую программу, лучше запустить ее как дочерний элемент вашего приложения, чтобы убедиться, что они находятся в одной группе и, таким образом, имеют одинаковые полномочия дляпапка.Если вы не можете, вы можете играть с группами (наберите ls -l -a на /data/data/ и посмотрите название группы).

НЕ ЗАБУДЬТЕ: Вы не могу на самом деле писать в трубу, пока кто-то не слушает на другой стороне.Поэтому, если вы протестируете файл, который я разместил на github, у вас будет такой результат logcat.

I/ActivityManager(  220): Start proc fr.stackr.android.upt for activity fr.stackr.android.upt/.UnixPipeActivity: pid=1359 uid=10048 gids={}
I/UPIPE   ( 1359): Attempt started
W/ActivityManager(  220): Launch timeout has expired, giving up wake lock!
W/ActivityManager(  220): Activity idle timeout for HistoryRecord{4643c8b8 fr.stackr.android.upt/.UnixPipeActivity}

Здесь системная пауза, потому что ничего не происходит ... Затем я запускаю cat v_pipe на телефоне.

V/UPIPE   ( 1359): SEND :: Try to write the first paragraph ....
V/UPIPE   ( 1359): SEND :: Bip
V/UPIPE   ( 1359): Flushing...
V/UPIPE   ( 1359): SEND :: Bip post flush
V/UPIPE   ( 1359): Closing…
I/UPIPE   ( 1359): Attempt ended

Готово.

закрытие : когда я закрываю OutputStreamWriter, сторона прослушивания (то есть cat) заканчивается.Если я закомментирую строку, cat все равно будет ждать ввода.

сброс : кажется важным, если вы хотите получить что-то без вызова close.

Возврат каретки : Использовать \n.

2 голосов
/ 23 апреля 2015

Я думаю, вы можете использовать ParcelFileDescriptor.createPipe()

Он вернет массив каналов для чтения и записи.Для получения дополнительной информации посетите веб-сайт разработчиков.

...