Required permissions have not been granted в fl studio mobile ошибка
FL Studio Mobile - действительно классное приложение для работы с аудио и музыкой. Пользователи не только смогут редактировать дорожки, но и получат полноценную возможность создавать новую музыку. Синтезатор и огромный набор сэмплов, различных звуков, пресетов в самых разных категориях и направлениях, а так же всего прочего поможет им в этом. Настраиваемая виртуальная клавиатура, секвенсор, различные дополнительные "устройства", функции, инструменты и всё это разнообразие с удобным управлением делает FL Studio Mobile настоящим подарком для всех кто стремиться использовать мобильный гаджет по максимуму.
FL Studio Mobile – лучшее мобильное приложение, с помощью которого можно создавать и редактировать собственные музыкальные композиции. Функционал программы подходит как для новичков, так и настоящих профессионалов своего дела. Огромный список вспомогательных плагинов и инструментов позволит создать массу крутых треков и поделиться ими с друзьями.
Интерфейс приложения нельзя назвать самым простым, разбираться придется достаточно долго и самое главное – самостоятельно. Освоиться будет гораздо проще если вы ранее пользовались данной программой на ПК. Чтобы начать творить необходимо создать свой первый проект, который по умолчанию идёт с барабанными установками и синтезатором. Тапы по клавишам и отдельно взятым элементам позволят создать мелодию. Её можно прослушать в реальном времени и тут же внести правки. Пробуйте, комбинируйте и в скором времени у вас получится, что-нибудь действительно стоящее.
Программа предоставляет доступ к более чем 200 музыкальных инструментов каждый из которых пользователь может настроить под свои нужды. Вы также сможете менять скорость и высоту звучания. Отдельно вынесена вкладка с фильтрами и эффектами позволяет изменить звуки в лучшую сторону и придать конечной композиции новые оттенки. Отсутствие русского языка делает использование данного приложениям немного затруднительным, но со временем приходит опыт и у вас будут получаться качественные треки.
Часто при установке приложения на Android нам приходилось видеть, что оно запрашивает какое-то немыслимое количество разрешений. Например:
Хорошо, если вы устанавливаете приложение от какого-то известного разработчика, которому можете доверять. Но весьма подозрительно, если вы устанавливаете новый музыкальный плеер, а ему для работы требуется, например, получать ваше местоположение. Или, тем более, фонарик, требующий доступ к смс и звонкам.
Некоторые разработчики, чтобы уменьшить недоверие, добавляют в описание приложения на Google Play информацию о том, зачем нужно то или иное разрешение.
К шестой версии Android ситуация поменялась. Теперь разрешения нужно запрашивать в процессе работы. О том, как этой новой возможностью пользоваться и ее некоторых подводных камнях будет рассказано далее.
Общая информация
Разрешения делятся на два типа (есть и другие, но они нас не интересуют):
Можно увидеть, что доступ к интернету не считается опасным. Все, кто использует рекламу в своих программах, могут вздохнуть с облегчением: отключить её, просто отобрав разрешение, не получится (все еще можно просто отключить интернет, но факт остается фактом).
Взаимодействие с пользователем
Посмотрим, как нужно производить взаимодействие с пользователем. Начнем непосредственно с запроса разрешения. С обычными разрешениями все понятно, это дело установщика приложений, нас это не интересует, а то, как мы будем запрашивать опасные разрешения, зависит от двух вещей.
Первая из них — это важность данного разрешения для вашего приложения, от этого зависит, когда нужно производить запрос. Если функция критична и без нее программа не будет иметь смысла, то смело просите разрешения прямо при запуске приложения. Например, если вы разрабатываете приложение для обмена sms, то без соответствующих разрешений с ним ничего не получится сделать, оно теряет всякий смысл. А если пользователь отказал, то не пропускаем его дальше, но даем возможность снова вызвать диалог запроса и даем инструкции что нужно делать.
- важные разрешения запрашиваем при запуске, вторичные — при первом использовании соответствующей функции;
- если понять, зачем нужно разрешение тяжело, предоставляем объяснение.
Но даже если у вас все хорошо с проверками и нет возможности заниматься внедрением новых возможностей, стоит перепроверить, все ли правильно работает, потому что иногда можно получить null не там, где его ожидаешь. Так, например, при использовании Environment.getExternalStorageDirectory() без наличия разрешения из группы Storage, мы получим File, но list() вернет нам заветный null. В документации такой исход описан, но для ситуации, когда File не является директорией. Так что проверка в любом случае лишней не будет.
Есть возможность добавить разрешение только для Android M и выше. Для это в манифесте нужно использовать новый тег <uses-permission-sdk-23 /> (ранее называвшийся <uses-permission-sdk-m />). Его синтаксис аналогичен обычному <uses-permission />. Это может быть полезно, если вы хотите добавить в существующее приложение возможность, которая требует дополнительного разрешения. Как вы помните, если новая версия программы требует дополнительных прав, пользователь должен вручную подтвердить ее обновление. Этого можно избежать, если новая функция не очень важна, отключив ее для более ранних версий системы, используя описанный ранее тег. В таком случае это разрешение будет вовсе отсутствовать.
В процессе отладки часто приходится включать/отключать разрешения. Заходить для этого каждый раз в настройки приложения не очень удобно. К счастью, это можно сделать с помощью adb:
И еще несколько полезных команд, смысл которых ясен из названия:
Перейдем к непосредственной реализации (предварительно не забудем обновить compileSdkVersion и targetSdkVersion до версии 23).
До момента, когда Marshmallow станет минимальной версией андроида для ваших приложений, еще далеко, поэтому нужно позаботиться об обратной совместимости. Конечно, можно делать проверки версии sdk, но зачем, если все реализовано за нас в support library v4 (ActivityCompat) и v13 (FragmentCompat). Если все же вам понадобятся оригинальные методы, то найти их не составит труда.
Во всех примерах используется ActivityCompat, так как они были сделаны для activity. Для fragment нужно использовать FragmentCompat. Если вы по какой-то причине не используете activity и fragment из support библиотек, то вам нужно реализовать интерфейс ActivityCompat.OnRequestPermissionsResultCallback или FragmentCompat.OnRequestPermissionsResultCallback соответственно.
Далее, если разрешение есть, выполняем нужное нам действие, а если нет, то его нужно запросить. Одновременно можно запросить несколько разрешений (пользователю по очереди будет показан запрос на каждое из них), если это необходимо.
Стоит упомянуть, что если разрешения находятся в одной permission group, то запросить достаточно одно из них, так как все остальные элементы этой группы станут также доступны. Но так делать не нужно. Потому что в будущем состав групп может поменяться, поэтому при запросе разрешений не нужно делать предположений относительно того находятся ли они в одной группе или нет.
UPD будто в подтверждение предыдущего параграфа, начиная с Android 8.0 разрешения из одной permission group не выдаются сразу — каждое разрешение нужно запрашивать отдельно, но все разрешения из одной группы будут выданы автоматически, без участия пользователя при первом же их запросе.
UPD2 это же поведение было замечено на Android 7.0 — если часть разрешений из группы выдана (не могу сказать с уверенностью, имеет ли значение какие именно), то остальные будут выдаваться по запросу сразу же без показа диалога. Это может вызвать проблемы, если ваше приложение объясняет пользователю зачем ей нужно то или иное разрешение еще до его запроса. В реальной жизни такое редко когда может возникнуть (только при использовании adb комманд), но стоит учитывать это при отладке приложения.
Для запроса используется метод ActivityCompat.requestPermissions(Activity activity, String[] permissions, int requestCode). Массив permissions соответственно содержит названия разрешений, которые вы хотите запросить. Отсюда видно, что одновременно можно запрашивать несколько разрешений. requestCode — значение, по которому в дальнейшем можно будет определить, на какой запрос разрешения вам пришел ответ подобно тому как мы получаем результат от activity, используя startActivityForResult. Кстати, если посмотреть на код requestPermission, то обнаружится, что это всего лишь особая версия startActivityForResult.
Как видите, напрямую запрашивать разрешения можно только из Activity или Fragment. Если разрешение требуется сервису, то придется запускать Activity, из которой уже можно будет сделать запрос. Лучше всего перед этим будет показать уведомление, содержащее информацию о недостающем разрешении с кнопкой для запуска этой самой Activity.
Результат запроса разрешения следует обрабатывать в onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults). Параметры requestCode и permissions содержат данные, которые вы передавали при запросе разрешений. Основные данные здесь несет массив grantResults, в котором находится информация о том, получены разрешения или нет. Каждому i-му элементу permissions соответствует i-ый элемент из grantResults. Их возможные значения аналогичны результату checkSelfPermission.
Размер массива grantResults проверяется для того, чтобы удостовериться, что запрос разрешения не был прерван (в этом случае permissions и grantResults не будут содержать элементов). Такую ситуацию следует рассматривать не как запрет разрешения, а как отмену запроса на него.
Если вы ранее уже запрашивали разрешение, но пользователь отказался предоставить его, необходимо объяснить ему причину запроса. Этого не нужно делать, если причина, по которой вы запрашиваете разрешение, абсолютно ясна. Если же есть вероятность, что вопрос “А зачем приложению это нужно?” возникнет, то объяснить это крайне желательно. Для того чтобы узнать, нужно ли показывать объяснение есть метод shouldShowRequestPermissionRationale(@NonNull Activity activity, @NonNull String permission), который возвращает boolean. Само же объяснение можно реализовать, например, с помощью Snackbar с кнопкой действия, по клику на которой происходит запрос разрешения, или диалогового окна, если разрешение критично необходимо.
Never ask again
Одной из проблем может стать опция “Never ask again”, которая появляется при повторном запросе разрешения, после того как пользователь уже отказал ранее. Как видно из названия, при её выборе диалог запроса не будет больше появляться. shouldShowRequestPermissionRationale будет выдавать false, а в onRequestPermissionsResult будет получен результат PackageManager.PERMISSION_DENIED. И получим разрешение мы, только если включить его непосредственно через настройки приложения в разделе Permissions.
Что с этим можно сделать? В первую очередь, конечно, сообщить пользователю, что для выполнения действия нет нужных прав. Далее возможным действием может быть предложение перейти в настройки и предоставить это разрешение вручную. Не лучший вариант, но лучше чем ничего. Реализовать это можно вновь с использованием Snackbar с кнопкой действия.
Перейти непосредственно на страницу с разрешениями не получится, поэтому лучшее, что вы можете сделать, это открыть настройки своего приложения. После этого можно, например, показать Toast с информацией, что нужно сделать.
В примере используются startActivityForResult и onActivityResult чтобы определить, что пользователь вернулся из activity настроек обратно в приложение и попробовать выполнить действие, которое нельзя было сделать без нужного разрешения. В методе showExtDirFilesCount нужно снова проверить есть ли разрешение для уверенности, что пользователь его все-таки выдал.
Здесь может возникнуть ситуация, которая не особенно мешает, если вы используете Snackbar для показа rationale, но портит UX, если вы решили использовать диалоги (причины этого решения мы не затрагиваем). А именно двойное появление rationale, до запроса разрешения и после него. Как это может произойти? У нас всего два метода, по которым мы можем судить о состоянии разрешения. Проблема в том, что до запроса разрешения ситуация, когда мы еще никогда не запрашивали это разрешение, и ситуация, когда пользователь ранее выбрал “Never ask again”, абсолютно одинаковы по значениям. А именно checkSeflPermission возвращает нам PERMISSION_DENIED, a shouldShowRequestPermissionRationale — false. Значит, показывать диалог для открытия настроек мы будем в onRequestPermissionsResult, где значение shouldShowRequestPermissionRationale точно будет разным для этих двух ситуаций. Все отлично? Не совсем. В этом callback’e никак нельзя определить была ли показана rationale или нет. Поэтому если вы показываете причину запроса, а далее пользователь просит больше его не спрашивать об этом разрешении, после нажатия на кнопку DENY он получит очередной rationale диалог, приглашающий его в настройки программы. Хорошие программы так себя не ведут.
Что делать в такой ситуации? В сети есть пара не очень красивых решений: одно из них — сохранять в SharedPreferences информацию о том имеется ли разрешение или нет, другое — хранить флаг о том была показана rationale или нет внутри класса. Первое решение не хорошо тем, что пока приложение не работает, пользователь может изменить настройки разрешений и информация в preferences будет неактуальной. Второй же способ не особо красивый.
Хорошим вариантом (на мой взгляд) будет завести два requestCode для каждого запроса, один для использования в rationale другой в остальных случаях. Этот способ так же не идеален и не особенно красив, но помогает придерживаться существующих методов, не внося ничего нового.
Intent
Есть еще одна важная рекомендация при использовании runtime разрешений. Не используйте их. Точнее, используйте, но только тогда, когда функционал, который вы собираетесь реализовать с их помощью, не сделал уже кто-то до вас.
В качестве самого показательного примера чаще всего вспоминают камеру. Используйте стандартное приложение камеры (или другие приложения, умеющие это делать), если вам нужно всего лишь сделать фотографию без какой-то особой логики. В этом вам помогут Intent’ы (подробнее).
Таким образом, вы сможете избавиться от некоторых опасных разрешений и упростите работу с приложением.
The Home Panel contains administrative settings grouped according to the SONGS, SETTINGS, SHOP and SHARE tabs.
NOTE: Tap the SAVE button to open the save dialog. Swipe to quick-save (overwrite) the current project, without a pop-up dialog.
Parameters
Tap the Home Button to access the following:
NOTE: Not all features are available on all operating systems.
SETTINGS
MIDI Device
- MIDI Device - When a external MIDI device is detected you can tap the button to use it. MIDI controllers will play instruments in the selected Playlist track.
- Scan Bluetooth MIDI devices - Select this to connect to Bluetooth MIDI devices. Afterward they will be available in the MIDI Device list above the Bluetooth scan control. On Android this will open a Location Access permission. Location Access permission. This is required by Google (See 'LE Beacons note), as it's possible to guess your location from nearby Bluetooth devices. We ONLY use Bluetooth for MIDI keyboards and we DO NOT try to guess your location or send any data to our servers
NOTE: For more information on working with MIDI Controllers on mobile devices see here.
Audio
- Recording Source - Select the audio input, when multiple inputs are available. On mobile devices with stereo microphones you will see 'Recording Source Stereo' and the option to select the Left or Right Channel (Mic). This is sometimes necessary when one mic is inferior to the other. This can happen if a mic is designed primarily used for noise-cancellation duties and not capturing the voice. When an Audio Interface is connected (on mobile devices, via adapters), other input options will be available. You may need to try them all to find the input you are looking for, if they are not explicitly and correctly identified. Input options on iOS also includes Audiobus inputs.
- Enable audio recording latency compensation - Ensures recorded audio is correctly aligned with the Playlist. For example, if you record the sound of FL Studio Mobile playing it's own kick track, latency calibration will ensure the kick recorded from the microphone is tightly aligned with the sequenced kick. This is necessary because on mobile devices there is usually a significant delay between the time when a sound was generated in the Playlist, to when it is audible from the speakers. This device audio latency is usually between 40 and 200 ms. If you are singing or playing in-time with the live audio, you are actually performing between 40 to 200 ms behind the sequenced events making the sound. Without latency compensation recordings made in time with live output will lag behind the internal sequencing. The compensation process removes a slice of audio, equal to the detected round-trip audio delay, from the start of the recording. This is the most accurate method to calibrate device latency.
- Using an internal microphone - 1. Seek a quiet location. 2. Disconnect headphones. 3 Turn up the volume to around 80-100% 4. Tap Calibrate.
- Using an external microphone - 1. Seek a quiet location. 2. Turn up the volume to around 50%. 3. Hold the mic close to a speaker or against one of your headphone speakers. 4. Tap Calibrate.
- Turn up the volume.
- Do not to move, bump or scuff your device while calibrating.
- Do you know where the microphone is located on your device and is it is free and clear to receive audio (remove any covers from your device for example).
- Is as quiet as possible when you tap Calibrate. This won't work on a bus! :)
- If you are using a multi-input Audio Interface does the Input selector match the microphone you are using.
- Fast - Lowest latency for devices that can handle this setting. Latency is the delay between tapping on the keyboard and hearing sound.
- Safe - Can reduce audio glitching at the expense of increased latency.
- Ultrasafe - Longest latency, but has the widest compatibility with devices.
- Native - Lowest latency using the latest audio protocols (Oboe). Recommended for all devices running Android 9 and up. Works with 'Low latency mode' (see above).
- Standard - General purpose sound mode with the widest compatibility with audio devices.
- Multitrack - Allows multiple inputs to be selected in the recording input section. Works with 'Low latency mode' (see above).
Application
- Metronome level - Adjust metronome level. The Metronome is accessed from the TMP button on the Transport Panel.
- Enable count-in when recording - Select to skip the metronome count-in when recording.
- Control Sizing - Change the size of the controls to better suit your use-case or device. NOTE: You must restart FL Studio Mobile for this setting to take effect. Troubleshooting: If a scaling option makes the UI unusable, delete the uiscale file located in ..\FLM User Files.
- Enable ghost notes - These are 'shadow' notes from other Clips playing at the same time location in the Playlist. Use them as a guide to write scores in key with other Clips, already in use.
Cloud backup:
- Sign in / Signed in - Depending on the state will show Sign in or Signed into [cloud service] as [email address]. Tap to sign-in or out of the cloud service you want.
- Sync automatically - When selected, the Cloud Backup will automatically backup your files to the Cloud service.
- Sync only when connected to WiFi - Prevents large file transfers over cellular connections where data plans may be limited or expensive.
- To purchase content - Tap the Buy button and complete the transaction through the App store.
- Restore purchases - Provided you are logged into your device using the same account as you used to purchase FL Studio Mobile, and you later re-installed FL Studio Mobile on a new device (or after deleting and installing it on the same device), the SHOP tab will show a RESTORE button. Tapping this should restore your purchase. For products provided by Image-Line, if you have registered your device with your Image-Line Account, when you re/install FL Studio Mobile on a device, tap the 'Users & support forum' button, THEN re/registered your device to your Image-Line Account, this content will be unlocked.
NOTE: In-app purchases, like FL Studio Mobile itself, are not transferable between operating systems (Android, iOS and Windows). For more details on why this is so, see this Knowledge Base article.
FILES (Backup or Share Files Between FL Studio Mobile Installations)
- Backup your files to an internet file drive service (Google Drive, OneDrive, Dropbox etc). NOTE: Backup will consume space on your Cloud Drive.
- Share files between devices logged into the same account using an internet file drive service.
- Share files directly between any devices running FL Studio Mobile, connected to the same network, using WiFi.
Cloud Backup / Share
-
Sign in - Tap the Sign In button and choose a Cloud service to login to. Sign in to the account with your normal login details. NOTE: Not all Cloud services are available on all operating systems. Cloud backup is not yet available on Windows UWP.
- Upload - The file is missing on the Cloud Drive OR the file was changed locally on your device. Action: Upload to Cloud as it is newer on your device.
- Download - The file is missing locally on your device OR the file was changed on the Cloud Drive. Action: Download from the Cloud as it is newer there.
- Decide - The file was changed on your device and on the Cloud Drive, so it is not clear which version you want to keep. This can happen if you edit the same project on two devices. In this case you have several options:
- Do nothing - Ignore this file until the next Sync.
- Delete from cloud - When uploading, delete the file on the Cloud drive and replace with the file on the device.
- Delete from device - When downloading, delete the file on the device and replace with the file on the Cloud Drive.
- Keep both - Renames the filename_1 to keep copies of both.
- Action - Shows the default Sync actions, discussed above. You can tap to change actions for individual files. To apply the actions shown on the Advanced dialog, press the Sync button at the bottom of the list. Once the window is closed, the system will revert to defaults as described above for the next Sync.
- File - Each file to be processed is listed. You can make bulk changes by tapping the Select button and then using the select icons and using the new controls that appear (Upload, Download, Keep Both, Do nothing). Keep Both is useful when there is a Decide conflict. That is, there is a file in the cloud and on the device, both of which, are changed.
- Select - Changes the lower button from Sync, to the options shown below. Tap Select, then use the individual file 'Select' icons, to choose the files you want to change and finally choose one of the Select options along the bottom:
- Download - Replace the file on the device with the one in the cloud.
- Upload - Replace the file in the Cloud with the one on the device.
- Keep both - Create an name_1 version of the file and keep name and name_1.
- Do nothing - Ignore this file until the next Sync.
Cloud Drive Notes
- Deleting files - When Cloud Sync is in use, you must delete them from all devices. Otherwise the file/s will be re-uploaded to the Cloud Drive when a synced device contacts the Cloud Drive. FL Studio Mobile will only delete files from the Cloud Drive, not from cross-synced devices, to minimize the risk of deleting important user files.
- Update frequency - When Sync is set to Manual the Cloud Drive is checked when the FILE tab is opened and then at 30 second intervals, so be patient if the Sync button does not immediately appear. When set to Automatic the Cloud Drive is checked every 2 minutes for updates. The Cloud Drive is also checked upon opening the FILES tab. When you see Cloud sync is active, this means all files are in sync or the device has not accessed the Cloud Drive yet, and does not know about pending changes.
- Target folders - FL Studio Mobile will only share data with the following locations: My Drumsets, My Instruments, My MIDI, My Presets, My Recordings, My Samples, My Tracks and My Songs. You can't rename these folders on your Cloud Drive, they must remain as set.
- Google Drive (Google) - FL Studio Mobile has limited permissions to access your drive. It will create a folder called FL Studio Mobile in the root of your drive. It can only access files that were uploaded by itself and won't be able to 'see' any files that you add directly to your Google Drive folder via a Web-browser or any other application, other than FL Studio Mobile.
NOTE: Cloud Drive features are controlled by their respective developers. We can't add features that are not supported by the services, or change how they function. As security is a high priority on these services, FL Studio Mobile can't access any parts of your drive it did not create.
Direct Share
- Make sure you are using the latest version of FL Studio Mobile on your device AND have the latest FL Studio plugin update - get it here.
- Connect your PC and or any Mobile devices to the same network. Normally this will be via WiFi, but it's OK if you have a combination of WiFi and Ethernet connections. The important factor is all devices are connected to the same Network.
- Open FL Studio Mobile on the PC and on the Mobile device.
- From the PC and Mobile device/s select the Share tab. NOTE: On the PC, the first time you do this, you will see a Firewall pop-up security message. Allow FL Studio Mobile access to your Network.
- On the Share tab, you should see all other instances of FL Studio Mobile, on all devices listed. Sharing goes FROM the device you are using TO the one you select.
- Tap on the device and Your Files (see below) is transferred to that device.
- You will need to restart the destination FL Studio Mobile instance to see the new data as it is scanned at start-up.
- Make a shortcut on your Computer desktop to your My Files location, then you can manually copy files in and out of this location and then use SHARE to send them to your Mobile Device, or get them after a SHARE to your computer, easy!
Managing User Files
This section relates to the internal file browser that opens when you choose Presets or add Audio Clips. The options here are available only for user files. They do not apply for factory installed content.
The Home panel has controls to Edit your user files or access the System Browser (Import)
Use the Edit control to Create Folders, Delete files or folders or Move files, for example.
Other locations with access to your User Files may have slightly different options.
Читайте также: