Browse Source

Merge pull request #1 from MikuAuahDark/micsupport

Recording support for Android (Java side)
Alex Szpakowski 6 years ago
parent
commit
29e49d9048

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -3,6 +3,7 @@
   android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android">
   android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android">
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-permission android:name="android.permission.VIBRATE"/>
   <uses-permission android:name="android.permission.VIBRATE"/>
+  <uses-permission android:name="android.permission.RECORD_AUDIO" />
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
 
 

+ 1 - 1
love/src/main/java/org/love2d/android/DownloadActivity.java

@@ -13,7 +13,7 @@ import android.util.Log;
 import androidx.core.app.ActivityCompat;
 import androidx.core.app.ActivityCompat;
 
 
 public class DownloadActivity extends Activity {
 public class DownloadActivity extends Activity {
-    public static final int EXTERNAL_STORAGE_REQUEST_CODE = 2;
+    public static final int EXTERNAL_STORAGE_REQUEST_CODE = 3;
 
 
     @Override
     @Override
     protected void onCreate(Bundle savedInstanceState) {
     protected void onCreate(Bundle savedInstanceState) {

+ 86 - 12
love/src/main/java/org/love2d/android/GameActivity.java

@@ -34,7 +34,9 @@ public class GameActivity extends SDLActivity {
     private static Context context;
     private static Context context;
     private static Vibrator vibrator = null;
     private static Vibrator vibrator = null;
     protected final int[] externalStorageRequestDummy = new int[1];
     protected final int[] externalStorageRequestDummy = new int[1];
+    protected final int[] recordAudioRequestDummy = new int[1];
     public static final int EXTERNAL_STORAGE_REQUEST_CODE = 1;
     public static final int EXTERNAL_STORAGE_REQUEST_CODE = 1;
+    public static final int RECORD_AUDIO_REQUEST_CODE = 2;
     private static boolean immersiveActive = false;
     private static boolean immersiveActive = false;
     private static boolean mustCacheArchive = false;
     private static boolean mustCacheArchive = false;
     private boolean storagePermissionUnnecessary = false;
     private boolean storagePermissionUnnecessary = false;
@@ -396,6 +398,36 @@ public class GameActivity extends SDLActivity {
         return audioManager.isMusicActive();
         return audioManager.isMusicActive();
     }
     }
 
 
+    @Keep
+    public void showRecordingAudioPermissionMissingDialog() {
+        Log.d("GameActivity", "showRecordingAudioPermissionMissingDialog()");
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                AlertDialog dialog = new AlertDialog.Builder(mSingleton)
+                    .setTitle("Audio Recording Permission Missing")
+                    .setMessage("It appears that this game uses mic capabilities. The game may not work correctly without mic permission!")
+                    .setNeutralButton("Continue", new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface di, int id) {
+                            synchronized (recordAudioRequestDummy) {
+                                recordAudioRequestDummy.notify();
+                            }
+                        }
+                    })
+                    .create();
+                dialog.show();
+            }
+        });
+
+        synchronized (recordAudioRequestDummy) {
+            try {
+                recordAudioRequestDummy.wait();
+            } catch (InterruptedException e) {
+                Log.d("GameActivity", "mic permission dialog", e);
+            }
+        }
+    }
+
     public void showExternalStoragePermissionMissingDialog() {
     public void showExternalStoragePermissionMissingDialog() {
         AlertDialog dialog = new AlertDialog.Builder(mSingleton)
         AlertDialog dialog = new AlertDialog.Builder(mSingleton)
             .setTitle("Storage Permission Missing")
             .setTitle("Storage Permission Missing")
@@ -412,22 +444,39 @@ public class GameActivity extends SDLActivity {
         if (grantResults.length > 0) {
         if (grantResults.length > 0) {
             Log.d("GameActivity", "Received a request permission result");
             Log.d("GameActivity", "Received a request permission result");
 
 
-            if (requestCode == EXTERNAL_STORAGE_REQUEST_CODE) {
-                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-                    Log.d("GameActivity", "Permission granted");
-                } else {
-                    Log.d("GameActivity", "Did not get permission.");
-                    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
-                        showExternalStoragePermissionMissingDialog();
+            switch (requestCode) {
+                case EXTERNAL_STORAGE_REQUEST_CODE: {
+                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                        Log.d("GameActivity", "Permission granted");
+                    } else {
+                        Log.d("GameActivity", "Did not get permission.");
+                        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
+                            showExternalStoragePermissionMissingDialog();
+                        }
                     }
                     }
+
+                    Log.d("GameActivity", "Unlocking LÖVE thread");
+                    synchronized (externalStorageRequestDummy) {
+                        externalStorageRequestDummy[0] = grantResults[0];
+                        externalStorageRequestDummy.notify();
+                    }
+                    break;
                 }
                 }
+                case RECORD_AUDIO_REQUEST_CODE: {
+                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                        Log.d("GameActivity", "Mic ermission granted");
+                    } else {
+                        Log.d("GameActivity", "Did not get mic permission.");
+                    }
 
 
-                Log.d("GameActivity", "Unlocking LÖVE thread");
-                synchronized (externalStorageRequestDummy) {
-                    externalStorageRequestDummy[0] = grantResults[0];
-                    externalStorageRequestDummy.notify();
+                    Log.d("GameActivity", "Unlocking LÖVE thread");
+                    synchronized (recordAudioRequestDummy) {
+                        recordAudioRequestDummy[0] = grantResults[0];
+                        recordAudioRequestDummy.notify();
+                    }
+                    break;
                 }
                 }
-           }
+            }
         }
         }
     }
     }
 
 
@@ -454,6 +503,31 @@ public class GameActivity extends SDLActivity {
         return ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
         return ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
     }
     }
 
 
+    @Keep
+    public boolean hasRecordAudioPermission() {
+        return ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
+    }
+
+    @Keep
+    public void requestRecordAudioPermission() {
+        if (ActivityCompat.checkSelfPermission(this,
+                Manifest.permission.RECORD_AUDIO)
+                == PackageManager.PERMISSION_GRANTED) {
+            return;
+        }
+
+        Log.d("GameActivity", "Requesting mic permission and locking LÖVE thread until we have an answer.");
+        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, RECORD_AUDIO_REQUEST_CODE);
+
+        synchronized (recordAudioRequestDummy) {
+            try {
+                recordAudioRequestDummy.wait();
+            } catch (InterruptedException e) {
+                Log.d("GameActivity", "requesting mic permission", e);
+            }
+        }
+    }
+
     @Keep
     @Keep
     public boolean initializeSafeArea() {
     public boolean initializeSafeArea() {
         if (android.os.Build.VERSION.SDK_INT >= 28) {
         if (android.os.Build.VERSION.SDK_INT >= 28) {