access camera from uiwebview?

后端 未结 1 1021
遥遥无期
遥遥无期 2020-12-05 12:29

Is it possible to access iphone\'s camera from uiwebview? I know phonegap does it, but how to make it work without phonegap?

Thanks.

相关标签:
1条回答
  • 2020-12-05 13:20

    You can implement the UIWebView Delegate and intercept any attempted page load. By setting a custom url, you can pass a message to Objective C, that can launch the camera. To send data back to the web weiw you can initiate a new load (as I do in my example), or pass in some javascript using another method on UIWebView.

    Here is a working example, I just wrote:

        #import "WebViewCamAppDelegate.h"
        #import <UIKit/UIKit.h>
        @interface uiwebviewcameraAppDelegate : NSObject <UIApplicationDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIWebViewDelegate> {
            UIWindow *window;
         UIViewController *viewController;
         UIWebView *webView; 
        }
    
        @property (nonatomic, retain) IBOutlet UIWindow *window;
    
        @end
    
    
        @implementation uiwebviewcameraAppDelegate
    
        @synthesize window;
    
        //This is the HTML we initially show in the WebView.  Note the url "showcamera:" is one I
        //invented with the intent to intercept it to show the camera.
        static NSString *htmlString = @"<br><A href=\"showcamera:\">Show Camera</a>";
    
    
        //Pretty Basic stuff.  We set the UIWebView Delegate so we can intercept the call and set up     //a ViewController so we can animate the UIImagePicker
        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     
         viewController = [[UIViewController alloc] init];
    
         webView = [[UIWebView alloc] initWithFrame:window.bounds];
         [webView loadHTMLString:htmlString baseURL:nil];
         webView.delegate = self;
    
         [viewController.view addSubview:webView];
         [window addSubview:viewController.view];
            [window makeKeyAndVisible];
         return YES;
        }
    
        //Note: I check to make sure the camera is available.  If it is not (iPod touch or Simulator) I show the photo library instead.
        -(void) showCamera {
         UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
         if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { 
          imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
         }
         else {
          imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
         }
         imagePicker.delegate = self;
         [viewController presentModalViewController:imagePicker animated:YES];
        }
    
        //Here we intercept any time the webview tries to load a document.  When the user hits our "showcamera: url" we go to work.
        - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
         if ([[[request URL] scheme] isEqualToString:@"showcamera"]) {
          [self showCamera];
          return NO;
         }
         return YES;
        }
    
        //After the imagepicker has done it's thing, we pass the data back to the webview to be displayed.
       //If we wanted to be fancy here, we could have done this via Javascript so we could dynamically insert an image without reloading the page.
        - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
         [viewController dismissModalViewControllerAnimated:YES];
         UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage];
         NSData *imageData = UIImageJPEGRepresentation (image, 0.5);
         [webView loadData:imageData MIMEType:@"image/jpeg" textEncodingName:@"UTF-8" baseURL:nil];
        }
    
    
        - (void)dealloc {
         [viewController release];
         [webView release];
            [window release];
            [super dealloc];
        }
    
        @end
    
    0 讨论(0)
提交回复
热议问题