mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-23 01:44:22 +00:00
Added feature RuntimePermissions, which allows to request permissions at runtime to access the microphone and bluetooth (required for Android apps using SDK Level 23 and above).
This commit is contained in:
parent
c8428f2168
commit
9ea874428c
13 changed files with 452 additions and 26 deletions
14
modules/juce_core/native/java/AndroidRuntimePermissions.java
Normal file
14
modules/juce_core/native/java/AndroidRuntimePermissions.java
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
private native void androidRuntimePermissionsCallback (boolean permissionWasGranted, long ptrToCallback);
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult (int permissionID, String permissions[], int[] grantResults)
|
||||
{
|
||||
boolean permissionsGranted = (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED);
|
||||
|
||||
if (! permissionsGranted)
|
||||
Log.d ("JUCE", "onRequestPermissionsResult: runtime permission was DENIED: " + getAndroidPermissionName (permissionID));
|
||||
|
||||
Long ptrToCallback = permissionCallbackPtrMap.get (permissionID);
|
||||
permissionCallbackPtrMap.remove (permissionID);
|
||||
androidRuntimePermissionsCallback (permissionsGranted, ptrToCallback);
|
||||
}
|
||||
|
|
@ -30,13 +30,12 @@ import android.content.DialogInterface;
|
|||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Looper;
|
||||
import android.os.Handler;
|
||||
import android.os.Build;
|
||||
import android.os.Process;
|
||||
import android.os.ParcelUuid;
|
||||
import android.os.Environment;
|
||||
import android.view.*;
|
||||
|
|
@ -50,19 +49,16 @@ import android.text.InputType;
|
|||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import java.lang.Runnable;
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Hashtable;
|
||||
import java.util.TimerTask;
|
||||
import java.util.*;
|
||||
import java.io.*;
|
||||
import java.net.URL;
|
||||
import java.net.HttpURLConnection;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaScannerConnection;
|
||||
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
|
||||
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.Manifest;
|
||||
$$JuceAndroidMidiImports$$ // If you get an error here, you need to re-save your project with the introjucer!
|
||||
|
||||
|
||||
|
|
@ -75,6 +71,73 @@ public class JuceAppActivity extends Activity
|
|||
System.loadLibrary ("juce_jni");
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
public boolean isPermissionDeclaredInManifest (int permissionID)
|
||||
{
|
||||
String permissionToCheck = getAndroidPermissionName(permissionID);
|
||||
|
||||
try
|
||||
{
|
||||
PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);
|
||||
|
||||
if (info.requestedPermissions != null)
|
||||
for (String permission : info.requestedPermissions)
|
||||
if (permission.equals (permissionToCheck))
|
||||
return true;
|
||||
}
|
||||
catch (PackageManager.NameNotFoundException e)
|
||||
{
|
||||
Log.d ("JUCE", "isPermissionDeclaredInManifest: PackageManager.NameNotFoundException = " + e.toString());
|
||||
}
|
||||
|
||||
Log.d ("JUCE", "isPermissionDeclaredInManifest: could not find requested permission " + permissionToCheck);
|
||||
return false;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
// these have to match the values of enum PermissionID in C++ class RuntimePermissions:
|
||||
private static final int JUCE_PERMISSIONS_RECORD_AUDIO = 1;
|
||||
private static final int JUCE_PERMISSIONS_BLUETOOTH_MIDI = 2;
|
||||
|
||||
private static String getAndroidPermissionName (int permissionID)
|
||||
{
|
||||
switch (permissionID)
|
||||
{
|
||||
case JUCE_PERMISSIONS_RECORD_AUDIO: return Manifest.permission.RECORD_AUDIO;
|
||||
case JUCE_PERMISSIONS_BLUETOOTH_MIDI: return Manifest.permission.ACCESS_COARSE_LOCATION;
|
||||
}
|
||||
|
||||
// unknown permission ID!
|
||||
assert false;
|
||||
return new String();
|
||||
}
|
||||
|
||||
public boolean isPermissionGranted (int permissionID)
|
||||
{
|
||||
return ContextCompat.checkSelfPermission (this, getAndroidPermissionName (permissionID)) == PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
private Map<Integer, Long> permissionCallbackPtrMap;
|
||||
|
||||
public void requestRuntimePermission (int permissionID, long ptrToCallback)
|
||||
{
|
||||
String permissionName = getAndroidPermissionName (permissionID);
|
||||
|
||||
if (ContextCompat.checkSelfPermission (this, permissionName) != PackageManager.PERMISSION_GRANTED)
|
||||
{
|
||||
// remember callbackPtr, request permissions, and let onRequestPermissionResult call callback asynchronously
|
||||
permissionCallbackPtrMap.put (permissionID, ptrToCallback);
|
||||
ActivityCompat.requestPermissions (this, new String[]{permissionName}, permissionID);
|
||||
}
|
||||
else
|
||||
{
|
||||
// permissions were already granted before, we can call callback directly
|
||||
androidRuntimePermissionsCallback (true, ptrToCallback);
|
||||
}
|
||||
}
|
||||
|
||||
$$JuceAndroidRuntimePermissionsCode$$ // If you get an error here, you need to re-save your project with the introjucer!
|
||||
|
||||
//==============================================================================
|
||||
public static class MidiPortID extends Object
|
||||
{
|
||||
|
|
@ -138,6 +201,8 @@ public class JuceAppActivity extends Activity
|
|||
setContentView (viewHolder);
|
||||
|
||||
setVolumeControlStream (AudioManager.STREAM_MUSIC);
|
||||
|
||||
permissionCallbackPtrMap = new HashMap<Integer, Long>();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue