2016-11-19 3 views
4

Я пытаюсь показать предварительный просмотр камеры заднего вида в Codename One. Я использую для этого собственный интерфейс (сначала я нацелен на Android).Как заставить разрешение «android.permission.CAMERA» добавить в манифест в Codename 1

Чтобы разрешить мое приложение, чтобы использовать камеру, не портя с сборки намеков, я добавил эти строки в моей главной форме:

if (Capture.hasCamera()){ 
    Dialog.show("Appareil photo détecté", "Votre matériel est bien équipé d'un appareil photo!", "OK", null); 
    } 

Я сделал это потому, что Codename One blog заявил

android.hardware .camera & android.permission.RECORD_AUDIO - инициируются com.codename1.Capture

Однако при отладке приложения с источниками, которые я получил от CN1 в Android Studio на реальном устройстве (API LEVEL 19 aka Kit Kat), я всегда получал java.lang.RuntimeException: Fail to connect to camera service.

Через некоторое время я понял, что исключение было связано с отсутствием следующего разрешения в Manifest.xml:

<uses-permission android:name="android.permission.CAMERA" android:required="false"/>

Пожалуйста, обратите внимание, что, как указано в CN1 блог линию <uses-feature android:name="android.hardware.camera" android:required="false" /> уже добавлен CN1.

Теперь, когда я добавил эту строку, живой просмотр хорошо показан.

Почему это разрешение не добавляется автоматически в манифест, должен ли я добавить его в подсказку сборки?

Кроме того, у меня есть другой проект, который использует камеру для фотосъемки и сохранения их на телефоне, а разрешение камеры не отображается (в приложении Android Application Info) и не запрашивается во время установки приложения, тогда как оно работает отлично. Обратите внимание, что, например, Приложение Twitter показывает «Делайте фотографии и записывайте видео» в разрешениях приложения, поэтому это не похоже на проблему с моим телефоном, скрывающим разрешение камеры.

EDIT 20 ноября 2016:

Действительно Android Developer's guide утверждает, что

Примечание: Если вы используете камеру, вызывая существующего приложения камеры, приложение не нужно просить это разрешение.

Именно поэтому CN1 не требует этого разрешения!

Спасибо, что помогли мне получить разрешение с CN1 вправо.

+0

Если вы не хотите запрашивать разрешения во время выполнения, вы можете установить compiledSDKversion для android L. В этом случае ваше приложение будет игнорировать все функции Marshmallow. – Tasneem

ответ

4

Вам нужно добавить следующую подсказку сборки:

android.xpermissions=<uses-permission android:name="android.permission.CAMERA" android:required="false"/> 

Вы также можете добавить это к cn1lib так он вводится автоматически.

+0

Я сделал это в конце концов. Но поскольку я использую камеру Capture.has(), почему CN1 автоматически добавляет '', а не требуемое разрешение, которое вы упомянули? – HelloWorld

+0

OK Я, наконец, понял ... мое недоразумение! В самом деле [Руководство для разработчиков Android] (https://developer.android.com/guide/topics/media/camera.html#manifest) гласит, что > Примечание. Если вы используете камеру, вызывая существующее приложение для камеры, ваше приложение не требуется запрашивать это разрешение. Вот почему CN1 не требует этого разрешения! – HelloWorld

+0

@Shai Почему "" ... >>> "false" <<<, пожалуйста, уточните, является ли это типа и включит или выключит разрешение для камеры? (У меня проблемы с моим приложением, и это поможет. Спасибо!) – ikevin8me

2

В прошлом вы добавляете разрешение, которое хотите предоставить манифесту, и затем оно запрашивается, когда пользователь пытается установить ваше приложение. С Android 6.0+ это изменилось. Теперь вы можете просто запросить разрешение, когда ваше приложение нуждается в нем в первый раз. После того как пользователь предоставит вам разрешение, вам не нужно снова спрашивать в следующий раз. Некоторые преимущества этого включают в себя информирование пользователя о том, почему вам нужны конкретные разрешения и не запрашивать разрешения, которые вам действительно не нужны.

Вы можете прочитать больше о том, как реализовать его здесь: https://developer.android.com/training/permissions/requesting.html

Там нет никакого способа использовать камеру телефонов, не спрашивая разрешения на какой-то момент.

+0

Я видел это на android 6.0+ спасибо. Но в текущем случае Android 4.4.2 задействован, который все еще используется (25% всех устройств Android, как [ноября 2016 года] (https://developer.android.com/about/dashboards/index.html)). – HelloWorld

+0

Я не уверен, в чем вы сомневаетесь; если вы спрашиваете, нужно ли добавить его в манифест, ответ «да». – Zarwan

+0

Я использую [Codename One] (www.codenameone.com) (пишите однажды в любом месте) для разработки моего приложения. И они заботятся о написании необходимых разрешений в зависимости от того, какие методы Codename One я использую. Однако они не добавляют разрешения на то, что я пишу в собственной реализации. ** Вот почему я использовал метод CN1, который должен был вызвать разрешение камеры в соответствии с документом, но это действительно не **. Поскольку у меня нет прямого доступа к манифесту, я должен был предоставить конкретный «подсказку сборки» под названием «android.xpermissions» и заполнил ее с помощью пропуска камеры. – HelloWorld