A simple android library project for Unity which contains some useful features:
- Capture android screen as a video.
- Request android permissions at runtime.
Thank for the open source project https://github.com/HBiSoft/HBRecorde which I use as a record service in this repository.
Visit this site to get a details explaining of Unity_Android_Screen_Recorder.
If you are using this library in one of your applications and would like to thank me:
or via PayPal:
https://www.paypal.com/paypalme/kampertee
- Clone this project and open it using Android Studio.
- Make module androidutils.
- Wait for build process to complete then get your plugin in Android_Screen_Recorder/unityrecorder/build/generated/outputs/aar/unityrecorder-release.aar
- Copy the unityrecorder-release.aar to Plugins/Android folder inside your project.
- Add a AndroidManifest.xml in the same folder which have the content below:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="your package name">
<application android:icon="@drawable/app_icon" android:launchMode="singleTask" android:label="@string/app_name">
<activity android:name="com.setik.androidutils.AndroidUtils" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Now your plugin is ready to use in any Unity project.
To record android screen you have to follow this instruction:
Call this inside Start() function of your script.
#if UNITY_ANDROID && !UNITY_EDITOR
using (AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
androidRecorder = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
androidRecorder.Call("setUpSaveFolder","Tee");//custom your save folder to Movies/Tee, by defaut it will use Movies/AndroidUtils
int width = (int)(Screen.width > SCREEN_WIDTH ? SCREEN_WIDTH : Screen.width);
int height = Screen.width > SCREEN_WIDTH ? (int)(Screen.height * SCREEN_WIDTH / Screen.width) : Screen.height;
int bitrate = (int)(1f * width * height / 100 * 240 * 7);
int fps = 30;
bool audioEnable=true;
androidRecorder.Call("setupVideo", width, height,bitrate, fps, audioEnable, VideoEncoder.H264.ToString());//this line manual sets the video record setting. You can use the defaut setting by comment this code block
}
#endif
Then call this to start record screen.
#if UNITY_ANDROID && !UNITY_EDITOR
if (!AndroidUtils.IsPermitted(AndroidPermission.RECORD_AUDIO))//RECORD_AUDIO is declared inside plugin manifest but we need to request it manualy
{
AndroidUtils.RequestPermission(AndroidPermission.RECORD_AUDIO);
onAllowCallback = () =>
{
androidRecorder.Call("startRecording");
};
onDenyCallback = () => { ShowToast("Need RECORD_AUDIO permission to record voice");};
onDenyAndNeverAskAgainCallback = () => { ShowToast("Need RECORD_AUDIO permission to record voice");};
}
else
androidRecorder.Call("startRecording");
#endif
Call
androidRecorder.Call("stopRecording");
Create a function name VideoRecorderCallback(string message) inside your project. It will receive callback from java side.
List of messages from java:
- init_record_error
- start_record
- stop_record
Runtime permission allow you to request android permission at runtime(for android 6.0 and above). Example: When your game need to access location service, instead of request this permission at the first runtime now you can delay it until the moment your app actually need to use the permission.
Note that. Your app can only request the permissions which have been declared in AndroidManifest.xml
1. You need to declare the permissions in AndroidManifest.xml. Then add this below meta-data to skip request permission dialog when you open app first time
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
the final AndroidManifest.xml must look similar like this.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android" package="com.setik.androidutils">
<application android:icon="@drawable/app_icon" android:label="@string/app_name">
<activity android:name="com.setik.androidutils.AndroidUtils" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
</application>
</manifest>
public static bool IsPermitted(AndroidPermission permission)
{
#if UNITY_ANDROID && !UNITY_EDITOR
using (var androidUtils = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
return androidUtils.GetStatic<AndroidJavaObject>("currentActivity").Call<bool>("hasPermission", GetPermissionStrr(permission));
}
#endif
return true;
}
public static void RequestPermission(AndroidPermission permission, UnityAction onAllow = null, UnityAction onDeny = null, UnityAction onDenyAndNeverAskAgain = null)
{
#if UNITY_ANDROID && !UNITY_EDITOR
onAllowCallback = onAllow;
onDenyCallback = onDeny;
onDenyAndNeverAskAgainCallback = onDenyAndNeverAskAgain;
using (var androidUtils = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
androidUtils.GetStatic<AndroidJavaObject>("currentActivity").Call("requestPermission", GetPermissionStrr(permission));
}
#endif
}
private static string GetPermissionStrr(AndroidPermission permission)
{
return "android.permission." + permission.ToString();
}
public enum AndroidPermission
{
ACCESS_COARSE_LOCATION,
ACCESS_FINE_LOCATION,
ADD_VOICEMAIL,
BODY_SENSORS,
CALL_PHONE,
CAMERA,
GET_ACCOUNTS,
PROCESS_OUTGOING_CALLS,
READ_CALENDAR,
READ_CALL_LOG,
READ_CONTACTS,
READ_EXTERNAL_STORAGE,
READ_PHONE_STATE,
READ_SMS,
RECEIVE_MMS,
RECEIVE_SMS,
RECEIVE_WAP_PUSH,
RECORD_AUDIO,
SEND_SMS,
USE_SIP,
WRITE_CALENDAR,
WRITE_CALL_LOG,
WRITE_CONTACTS,
WRITE_EXTERNAL_STORAGE
}
private void OnAllow(){}
private void OnDeny(){}
private void OnDenyAndNeverAskAgain(){}