I'm new to Objective-C so please bear with me. I'm trying to open the native iOS Media Library and grab an image to use it as a texture. I've created a MediaBrowser.h and MediaBrowser.mm inside Assets->Plugins->iOS folder.
I don't know if this is the correct approach to achieve my goals. If there is a best practice way to go, I'm also willing to rewrite the whole thing.
Any help is highly appreciated. Thanks
In Unity:
I've addet a script component (ImageUploadButton.cs) to a UI button prefab:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Runtime.InteropServices;
public class ImageUploadButton : MonoBehaviour, IPointerClickHandler {
[DllImport ("__Internal")]
private static extern string _invokeMediaBrowser();
public void invokeMediaBrowser() {
if (Application.platform == RuntimePlatform.IPhonePlayer)
_invokeMediaBrowser ();
}
public void OnPointerClick(PointerEventData eventData) {
invokeMediaBrowser();
}
}
My MediaBrowser.h looks like:
#import
#import
#import
#import "UnityAppController.h"
@interface MediaBrowser : UIImagePickerController {
NSString *selectedImagePath;
}
- (BOOL) startMediaBrowserFromViewController: (UIViewController*) controller usingDelegate: (id ) delegate;
@end
My MediaBrowser.mm is based on an apple developer article ([Picking an Item from the Photo Library][1]) , it looks like:
#import "MediaBrowser.h"
@implementation MediaBrowser
- (BOOL) startMediaBrowserFromViewController: (UIViewController*) controller usingDelegate: (id ) delegate {
if (([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum] == NO) || (delegate == nil) || (controller == nil))
return NO;
UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init];
mediaUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
// Displays saved pictures and movies, if both are available, from the
// Camera Roll album.
mediaUI.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
// Hides the controls for moving & scaling pictures, or for
// trimming movies. To instead show the controls, use YES.
mediaUI.allowsEditing = NO;
mediaUI.delegate = delegate;
//[controller presentModalViewController: mediaUI animated: YES];
[controller presentViewController:mediaUI animated:YES completion:nil];
return YES;
}
- (void) imagePickerController: (UIImagePickerController *) picker didFinishPickingMediaWithInfo: (NSDictionary *) info {
NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];
UIImage *originalImage, *editedImage, *imageToUse;
// Handle a still image picked from a photo album
if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo) {
editedImage = (UIImage *) [info objectForKey: UIImagePickerControllerEditedImage];
originalImage = (UIImage *) [info objectForKey: UIImagePickerControllerOriginalImage];
if (editedImage) {
imageToUse = editedImage;
} else {
imageToUse = originalImage;
}
// Do something with imageToUse
selectedImagePath = [[info objectForKey:UIImagePickerControllerMediaURL] path];
}
// Handle a movied picked from a photo album
if (CFStringCompare ((CFStringRef) mediaType, kUTTypeMovie, 0) == kCFCompareEqualTo) {
NSString *moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] path];
// Do something with the picked movie available at moviePath
selectedImagePath = moviePath;
}
UnitySendMessage("UIManager", "setWebGlLogo", [selectedImagePath UTF8String]);
[[picker parentViewController] dismissModalViewControllerAnimated: YES];
//[picker release];
}
- (NSString*) getSelectedImagePath {
return selectedImagePath;
}
static MediaBrowser *mediaBrowserDelegate = nil;
char* MakeStringCopy (const char* string) {
if (string == NULL)
return NULL;
char* res = (char*)malloc(strlen(string)+1);
strcpy(res, string);
return res;
}
extern "C" {
void _invokeMediaBrowser() {
mediaBrowserDelegate = [[MediaBrowser alloc] init];
UnityAppController *appCtrl = GetAppController();
UIViewController *rootViewController = [appCtrl rootViewController];
[mediaBrowserDelegate startMediaBrowserFromViewController:rootViewController usingDelegate:(id)mediaBrowserDelegate];
}
}
@end
On selecting an image, I'm using "UnitySendMessage" to send the path of the selected image to the "setWebGlLogo" c# method, I'm re-using this method, it is used for the WebGl image upload. I looks like:
public IEnumerator setWebGlLogo(string imgPath) {
WWW www = new WWW (imgPath);
yield return www;
Renderer renderer = LogoMesh.GetComponent ();
renderer.material.mainTexture = www.texture;
}
On the Image upload button click, I get the following error:
![xcode erroron image button click][2]
[1]: https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/CameraAndPhotoLib_TopicsForIOS/Articles/PickinganItemfromthePhotoLibrary.html
[2]: /storage/temp/64162-screen-shot-2016-02-18-at-120259.jpg
↧