Created
December 29, 2020 08:03
-
-
Save melikeeroglu/c616f0efef041ad5090441b6e9027f3e to your computer and use it in GitHub Desktop.
DriveManager
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using HuaweiMobileServices.Drive; | |
using HuaweiMobileServices.Id; | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using UnityEngine; | |
using UnityEngine.Android; | |
using UnityEngine.UI; | |
public class DriveManager : MonoBehaviour, DriveCredential.AccessMethod | |
{ | |
public string accessToken; | |
public DriveCredential mCredential; | |
public HuaweiMobileServices.Drive.File fileUploaded; | |
InputField downloadFileName; | |
public String unionId; | |
DriveManager Drive; | |
private static readonly int DIRECT_DOWNLOAD_MAX_SIZE = 20 * 1024 * 1024; | |
private static Dictionary<String, String> MIME_TYPE_MAP = new Dictionary<String, String>(); | |
GameObject dialog = null; | |
// Start is called before the first frame update | |
void Start() | |
{ | |
initMimeType(); | |
Drive = new DriveManager(); | |
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken; | |
Debug.Log("Token" + HuaweiIdAuthManager.AuthResult.IdToken); | |
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken; | |
unionId = HuaweiIdAuthManager.AuthResult.UnionId; | |
int returnCode = Init(unionId, accessToken, () => HuaweiIdAuthManager.AuthResult.AccessToken); | |
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite)) | |
{ | |
Permission.RequestUserPermission(Permission.ExternalStorageWrite); | |
dialog = new GameObject(); | |
} | |
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageRead)) | |
{ | |
Permission.RequestUserPermission(Permission.ExternalStorageRead); | |
dialog = new GameObject(); | |
} | |
} | |
public void UploadFile() | |
{ | |
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken; | |
unionId = HuaweiIdAuthManager.AuthResult.UnionId; | |
DriveCredential.Builder builder = new DriveCredential.Builder(unionId, refreshToken); | |
mCredential = builder.Build().SetAccessToken(accessToken); | |
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); | |
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); | |
jo.Call("getImageInputStreamFromGallery", new DriveListener(this)); | |
} | |
// Update is called once per frame | |
void Update() | |
{ | |
} | |
public void CreateDir() | |
{ | |
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken; | |
unionId = HuaweiIdAuthManager.AuthResult.UnionId; | |
DriveCredential.Builder builder = new DriveCredential.Builder(unionId, refreshToken); | |
mCredential = builder.Build().SetAccessToken(accessToken); | |
CreateDirectory(); | |
} | |
public void DownloadFile() | |
{ | |
accessToken = HuaweiIdAuthManager.AuthResult.AccessToken; | |
unionId = HuaweiIdAuthManager.AuthResult.UnionId; | |
DriveCredential.Builder builder = new DriveCredential.Builder(unionId, refreshToken); | |
mCredential = builder.Build().SetAccessToken(accessToken); | |
downloadFileName = GameObject.Find("downloadFileName").GetComponent<InputField>(); | |
DownLoadFile(downloadFileName.text); | |
} | |
//private static readonly int DIRECT_UPLOAD_MAX_SIZE = 20 * 1024 * 1024; | |
//nonresumable | |
public void CreateFile(AndroidJavaObject javaObject,String mimeType, int inputStreamLength) | |
{ | |
try | |
{ | |
InputStreamContent streamContent = new InputStreamContent(mimeType, javaObject); | |
AndroidJavaClass a = new AndroidJavaClass("java.util.Collections"); | |
AndroidJavaObject parentFolder = new AndroidJavaObject("java.lang.String",""); | |
String time = DateTime.Now.ToString("yyyyMMddHHmmss"); | |
String fileName = time + MimeType(mimeType); | |
Debug.Log("datetime" + fileName); | |
streamContent.SetLength(inputStreamLength); | |
HuaweiMobileServices.Drive.File content = new HuaweiMobileServices.Drive.File() | |
.SetFileName(fileName) | |
.SetParentFolder(a.CallStatic<AndroidJavaObject>("singletonList", parentFolder)); | |
Drive drive = BuildDrive(); | |
Drive.Files.Create request = drive.files().create(content, streamContent); | |
MediaHttpUploader uploader = request.GetMediaHttpUploader(); | |
uploader.SetDirectUploadEnabled(true); | |
content = request.Execute(); | |
ShowTips("File Uploaded Successfully"); | |
} | |
catch (Exception e) | |
{ | |
Debug.Log("createFile exception: " + e.ToString()); | |
ShowTips("File Upload Failed"); | |
} | |
} | |
private HuaweiMobileServices.Drive.File fileSearched; | |
private void DownLoadFile(String searchFileName) | |
{ | |
try | |
{ | |
if (searchFileName == null) | |
{ | |
Debug.Log("DriveDownload"+ "executeFilesGet error, need to create file."); | |
return; | |
} | |
String imagePath = "/storage/emulated/0/DCIM/Camera/"; | |
Drive drive = BuildDrive(); | |
String containers = ""; | |
String queryFile = "fileName = '" + searchFileName + "' and mimeType != 'application/vnd.huawei-apps.folder'"; | |
FileList files; | |
Drive.Files.List request1 = drive.files().list(); | |
while (true) | |
{ | |
files = request1 | |
.SetQueryParam(queryFile) | |
//.SetPageSize(10) | |
.SetOrderBy("fileName") | |
.SetFields("category,nextCursor,files(id,fileName,size)") | |
.SetContainers(containers) | |
.Execute(); | |
if (files == null || files.GetFiles().Count() > 0) | |
{ | |
break; | |
} | |
if (!IsNullOrEmpty(files.GetNextCursor())) | |
{ | |
request1.SetCursor(files.GetNextCursor()); | |
} | |
else | |
{ | |
break; | |
} | |
} | |
String text = ""; | |
if (files != null && files.GetFiles().Count > 0) | |
{ | |
fileSearched = files.GetFiles()[0]; | |
text = searchFileName; | |
} | |
else | |
{ | |
text = "empty"; | |
} | |
// Obtain file metadata. | |
Drive.Files.Get request = drive.files().get(fileSearched.GetId()); | |
request.SetFields("id,size"); | |
HuaweiMobileServices.Drive.File res = request.Execute(); | |
// Download a file. | |
AndroidJavaObject javaObject = res.GetSize(); | |
long size = javaObject.Call<long>("longValue"); | |
Drive.Files.Get get = drive.files().get(fileSearched.GetId()); | |
get.SetForm("media"); | |
MediaHttpDownloader downloader = get.GetMediaHttpDownloader(); | |
bool isDirectDownload = false; | |
if (size < DIRECT_DOWNLOAD_MAX_SIZE) | |
{ | |
isDirectDownload = true; | |
} | |
downloader.SetContentRange(0, size - 1).SetDirectDownloadEnabled(isDirectDownload); | |
// String time = DateTime.Now.ToString("yyyyMMddHHmmss"); | |
String fileName = /*time+".jpg"*/searchFileName; | |
AndroidJavaObject f = new AndroidJavaObject("java.io.File", imagePath + fileName); | |
AndroidJavaObject fileOutputStream = new AndroidJavaObject("java.io.FileOutputStream", f); | |
get.ExecuteContentAndDownloadTo(fileOutputStream); | |
ShowTips("File Downloaded Successfully"); | |
} catch (Exception e) { | |
Debug.Log("executeFilesGet exception: " + e.ToString()); | |
ShowTips("File Download Failed"); | |
} | |
} | |
private HuaweiMobileServices.Drive.File CreateDirectory() | |
{ | |
HuaweiMobileServices.Drive.File directory = null; | |
try | |
{ | |
Drive drive = BuildDrive(); | |
Dictionary<String, String> appProperties = new Dictionary<String,String>(); | |
appProperties.Add("appProperties", "property"); | |
String dirName = DateTime.Now.ToString("yyyyMMdd"); | |
HuaweiMobileServices.Drive.File file = new HuaweiMobileServices.Drive.File(); | |
file.SetFileName(dirName) | |
.SetMimeType("application/vnd.huawei-apps.folder"); | |
HuaweiMobileServices.Drive.Drive.Files.Create c = drive.files().create(file); | |
directory = c.Execute(); | |
ShowTips("Directory Created"); | |
} | |
catch (Exception e) | |
{ | |
Debug.Log( "createDirectory error: " + e.ToString()); | |
ShowTips("Directory can not created"); | |
} | |
return directory; | |
} | |
private void ShowTips(string toastText) | |
{ | |
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); | |
AndroidJavaObject unityActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); | |
if (unityActivity != null) | |
{ | |
AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast"); | |
unityActivity.Call("runOnUiThread", new AndroidJavaRunnable(() => | |
{ | |
AndroidJavaObject toastObject = toastClass.CallStatic<AndroidJavaObject>("makeText", unityActivity, toastText, 0); | |
toastObject.Call("show"); | |
})); | |
} | |
} | |
private Drive BuildDrive() | |
{ | |
Drive.Builder builder = new Drive.Builder(mCredential); | |
Drive service = builder.Build(); | |
return service; | |
} | |
//TODO: create DriveCode class | |
public int Init(String unionID, String at, Func<String> refreshToken ) | |
{ | |
if (IsNullOrEmpty(unionID) || IsNullOrEmpty(at)) | |
{ | |
return /*DriveCode.ERROR*/900150001; | |
} | |
Debug.Log("unionID" + unionID); | |
DriveCredential.Builder builder = new DriveCredential.Builder(unionID, refreshToken); | |
mCredential = builder.Build().SetAccessToken(at); | |
return /*DriveCode.SUCCESS*/0; | |
} | |
private String MimeType(String fileSuffix) | |
{ | |
if (MIME_TYPE_MAP.ContainsKey(fileSuffix)) | |
{ | |
Debug.Log("filenullor123" + MIME_TYPE_MAP[fileSuffix]); | |
return MIME_TYPE_MAP[fileSuffix]; | |
} | |
else | |
return "*/*"; | |
} | |
public static bool IsNullOrEmpty(String var0) | |
{ | |
return var0 == null || var0.Length == 0; | |
} | |
public string refreshToken() | |
{ | |
return accessToken; | |
} | |
public void initMimeType() | |
{ | |
MIME_TYPE_MAP.Add(".3gp", "video/3gpp"); | |
MIME_TYPE_MAP.Add(".apk", "application/vnd.android.package-archive"); | |
MIME_TYPE_MAP.Add(".asf", "video/x-ms-asf"); | |
MIME_TYPE_MAP.Add(".avi", "video/x-msvideo"); | |
MIME_TYPE_MAP.Add(".bin", "application/octet-stream"); | |
MIME_TYPE_MAP.Add(".bmp", "image/bmp"); | |
MIME_TYPE_MAP.Add(".c", "text/plain"); | |
MIME_TYPE_MAP.Add(".class", "application/octet-stream"); | |
MIME_TYPE_MAP.Add(".conf", "text/plain"); | |
MIME_TYPE_MAP.Add(".cpp", "text/plain"); | |
MIME_TYPE_MAP.Add(".doc", "application/msword"); | |
MIME_TYPE_MAP.Add(".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); | |
MIME_TYPE_MAP.Add(".xls", "application/vnd.ms-excel"); | |
MIME_TYPE_MAP.Add(".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); | |
MIME_TYPE_MAP.Add(".exe", "application/octet-stream"); | |
MIME_TYPE_MAP.Add(".gif", "image/gif"); | |
MIME_TYPE_MAP.Add(".gtar", "application/x-gtar"); | |
MIME_TYPE_MAP.Add(".gz", "application/x-gzip"); | |
MIME_TYPE_MAP.Add(".h", "text/plain"); | |
MIME_TYPE_MAP.Add(".htm", "text/html"); | |
MIME_TYPE_MAP.Add(".html", "text/html"); | |
MIME_TYPE_MAP.Add(".jar", "application/java-archive"); | |
MIME_TYPE_MAP.Add(".java", "text/plain"); | |
MIME_TYPE_MAP.Add(".jpeg", "image/jpeg"); | |
MIME_TYPE_MAP.Add("image/jpeg", ".jpg"); | |
MIME_TYPE_MAP.Add(".js", "application/x-javascript"); | |
MIME_TYPE_MAP.Add(".log", "text/plain"); | |
MIME_TYPE_MAP.Add(".m3u", "audio/x-mpegurl"); | |
MIME_TYPE_MAP.Add(".m4a", "audio/mp4a-latm"); | |
MIME_TYPE_MAP.Add(".m4b", "audio/mp4a-latm"); | |
MIME_TYPE_MAP.Add(".m4p", "audio/mp4a-latm"); | |
MIME_TYPE_MAP.Add(".m4u", "video/vnd.mpegurl"); | |
MIME_TYPE_MAP.Add(".m4v", "video/x-m4v"); | |
MIME_TYPE_MAP.Add(".mov", "video/quicktime"); | |
MIME_TYPE_MAP.Add(".mp2", "audio/x-mpeg"); | |
MIME_TYPE_MAP.Add(".mp3", "audio/x-mpeg"); | |
MIME_TYPE_MAP.Add(".mp4", "video/mp4"); | |
MIME_TYPE_MAP.Add(".mpc", "application/vnd.mpohun.certificate"); | |
MIME_TYPE_MAP.Add(".mpe", "video/mpeg"); | |
MIME_TYPE_MAP.Add(".mpeg", "video/mpeg"); | |
MIME_TYPE_MAP.Add(".mpg", "video/mpeg"); | |
MIME_TYPE_MAP.Add(".mpg4", "video/mp4"); | |
MIME_TYPE_MAP.Add(".mpga", "audio/mpeg"); | |
MIME_TYPE_MAP.Add(".msg", "application/vnd.ms-outlook"); | |
MIME_TYPE_MAP.Add(".ogg", "audio/ogg"); | |
MIME_TYPE_MAP.Add(".pdf", "application/pdf"); | |
MIME_TYPE_MAP.Add(".png", "image/png"); | |
MIME_TYPE_MAP.Add(".pps", "application/vnd.ms-powerpoint"); | |
MIME_TYPE_MAP.Add(".ppt", "application/vnd.ms-powerpoint"); | |
MIME_TYPE_MAP.Add(".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); | |
MIME_TYPE_MAP.Add(".prop", "text/plain"); | |
MIME_TYPE_MAP.Add(".rc", "text/plain"); | |
MIME_TYPE_MAP.Add(".rmvb", "audio/x-pn-realaudio"); | |
MIME_TYPE_MAP.Add(".rtf", "application/rtf"); | |
MIME_TYPE_MAP.Add(".sh", "text/plain"); | |
MIME_TYPE_MAP.Add(".tar", "application/x-tar"); | |
MIME_TYPE_MAP.Add(".tgz", "application/x-compressed"); | |
MIME_TYPE_MAP.Add(".txt", "text/plain"); | |
MIME_TYPE_MAP.Add(".wav", "audio/x-wav"); | |
MIME_TYPE_MAP.Add(".wma", "audio/x-ms-wma"); | |
MIME_TYPE_MAP.Add(".wmv", "audio/x-ms-wmv"); | |
MIME_TYPE_MAP.Add(".wps", "application/vnd.ms-works"); | |
MIME_TYPE_MAP.Add(".xml", "text/plain"); | |
MIME_TYPE_MAP.Add(".z", "application/x-compress"); | |
MIME_TYPE_MAP.Add(".zip", "application/x-zip-compressed"); | |
} | |
public class DriveListener : AndroidJavaProxy | |
{ | |
DriveManager d; | |
public DriveListener(DriveManager driveManager) : base("com.melike.drive.huawei.HmsDriveActivity$GalleryListener") { | |
d = driveManager; | |
} | |
public void getGalleryUri(AndroidJavaObject javaObject, String mimeType, int size) | |
{ | |
AndroidJavaObject thread = new AndroidJavaObject("java.lang.Thread", new DriveBackTask(d, javaObject, mimeType,size)); | |
thread.Call("start"); | |
} | |
} | |
public class DriveBackTask : AndroidJavaProxy | |
{ | |
DriveManager driveListener; | |
AndroidJavaObject javaObject1; | |
String mimeType; | |
int size; | |
public DriveBackTask (DriveManager listener, AndroidJavaObject javaObject, String mimeType, int size) : base("java.lang.Runnable") { | |
driveListener = listener; | |
javaObject1 = javaObject; | |
this.mimeType = mimeType; | |
this.size = size; | |
} | |
public void run() | |
{ | |
driveListener.CreateFile(javaObject1, mimeType, size); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment