132 lines
5.2 KiB
C++
132 lines
5.2 KiB
C++
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library.
|
|
Copyright (c) 2017 - ROLI Ltd.
|
|
|
|
JUCE is an open source library subject to commercial or open-source
|
|
licensing.
|
|
|
|
The code included in this file is provided under the terms of the ISC license
|
|
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
|
To use, copy, modify, and/or distribute this software for any purpose with or
|
|
without fee is hereby granted provided that the above copyright notice and
|
|
this permission notice appear in all copies.
|
|
|
|
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
|
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
|
DISCLAIMED.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
namespace juce
|
|
{
|
|
|
|
//==============================================================================
|
|
/**
|
|
Class to handle app runtime permissions for certain functionality on some platforms.
|
|
|
|
The use of this class is currently only required if the app should run on
|
|
Android API level 23 and higher.
|
|
|
|
On lower API levels, the permissions are specified in the app manifest. On iOS,
|
|
runtime permission requests are handled automatically by the Apple APIs and not
|
|
manually in the app code. On Windows, OS X, and Linux, runtime permissions are not
|
|
used at all. In all these cases, request() will simply call through to the
|
|
callback with no overhead and pass true (making it safe to use on all platforms).
|
|
|
|
For example, to enable audio recording on Android in your cross-platform app,
|
|
you could modify your code as follows:
|
|
|
|
Old code:
|
|
|
|
audioDeviceManager.initialise (2, 2, nullptr, true, String(), nullptr);
|
|
|
|
New code:
|
|
|
|
RuntimePermissions::request (
|
|
RuntimePermissions::audioRecording,
|
|
[this] (bool wasGranted)
|
|
{
|
|
if (! wasGranted)
|
|
{
|
|
// e.g. display an error or initialise with 0 input channels
|
|
return;
|
|
}
|
|
|
|
audioDeviceManager.initialise (2, 2, nullptr, true, String(), nullptr);
|
|
}
|
|
);
|
|
|
|
@tags{Core}
|
|
*/
|
|
class JUCE_API RuntimePermissions
|
|
{
|
|
public:
|
|
//==============================================================================
|
|
enum PermissionID
|
|
{
|
|
/** Permission to access the microphone (required on Android).
|
|
You need to request this, for example, to initialise an AudioDeviceManager with
|
|
a non-zero number of input channels, and to open the default audio input device.
|
|
*/
|
|
recordAudio = 1,
|
|
|
|
/** Permission to scan for and pair to Bluetooth MIDI devices (required on Android).
|
|
You need to request this before calling BluetoothMidiDevicePairingDialogue::open(),
|
|
otherwise no devices will be found.
|
|
*/
|
|
bluetoothMidi = 2,
|
|
|
|
/** Permission to read from external storage such as SD cards */
|
|
readExternalStorage = 3,
|
|
|
|
/** Permission to write to external storage such as SD cards */
|
|
writeExternalStorage = 4,
|
|
|
|
/** Permission to use camera */
|
|
camera = 5
|
|
};
|
|
|
|
//==============================================================================
|
|
/** Function type of runtime permission request callbacks. */
|
|
using Callback = std::function<void (bool)>;
|
|
|
|
//==============================================================================
|
|
/** Call this method to request a runtime permission.
|
|
|
|
@param permission The PermissionID of the permission you want to request.
|
|
|
|
@param callback The callback to be called after the request has been granted
|
|
or denied; the argument passed will be true if the permission
|
|
has been granted and false otherwise.
|
|
|
|
If no runtime request is required or possible to obtain the permission, the
|
|
callback will be called immediately. The argument passed in will be true
|
|
if the permission is granted or no permission is required on this platform,
|
|
and false otherwise.
|
|
|
|
If a runtime request is required to obtain the permission, the callback
|
|
will be called asynchronously after the OS has granted or denied the requested
|
|
permission (typically by displaying a dialog box to the user and waiting until
|
|
the user has responded).
|
|
*/
|
|
static void request (PermissionID permission, Callback callback);
|
|
|
|
/** Returns whether a runtime request is required to obtain the permission
|
|
on the current platform.
|
|
*/
|
|
static bool isRequired (PermissionID permission);
|
|
|
|
/** Returns true if the app has been already granted this permission, either
|
|
via a previous runtime request or otherwise, or no permission is necessary.
|
|
|
|
Note that this can be false even if isRequired returns false. In this case,
|
|
the permission can not be obtained at all at runtime.
|
|
*/
|
|
static bool isGranted (PermissionID permission);
|
|
};
|
|
|
|
} // namespace juce
|