适用于 Android 的 PhoneGap 相机 API - 未捕获的异常
Posted
技术标签:
【中文标题】适用于 Android 的 PhoneGap 相机 API - 未捕获的异常【英文标题】:PhoneGap Camera API for Android - Uncaught Exception 【发布时间】:2012-07-12 18:57:35 【问题描述】:我正在尝试使用 android 中的 Phone gap 运行 Camera API,但我遇到了各种问题。
我刚刚复制了 phonegap 相机示例。
我收到以下错误
07-12 18:18:00.706: E/Web Console(17837): Uncaught TypeError: Cannot read property 'SAVEDPHOTOALBUM' of undefined at file:///android_asset/www/index.html:98
07-12 18:17:59.456: E/Web Console(17837): Uncaught ReferenceError: Camera is not defined at file:///android_asset/www/index.html:67
我尝试了所有其他目的地类型。效果不错
destinationType: destinationType.FILE_URI
destinationType: Camera.DestinationType.FILE_URI
destinationType: destinationType.DATA_URL
我还添加了相机权限和硬件相机权限。但是还是失败了
下面是
<!DOCTYPE html>
<html>
<head>
<title>Capture Photo</title>
<script type="text/javascript" charset="utf-8" src="phonegap-1.0.0.js"></script>
<script type="text/javascript" charset="utf-8">
var pictureSource; // picture source
var destinationType; // sets the format of returned value
// Wait for PhoneGap to connect with the device
//
document.addEventListener("deviceready",onDeviceReady,false);
// PhoneGap is ready to be used!
//
function onDeviceReady()
pictureSource=navigator.camera.PictureSourceType;
destinationType=navigator.camera.DestinationType;
// Called when a photo is successfully retrieved
//
function onPhotoDataSuccess(imageData)
// Uncomment to view the base64 encoded image data
// console.log(imageData);
// Get image handle
//
var smallImage = document.getElementById('smallImage');
// Unhide image elements
//
smallImage.style.display = 'block';
// Show the captured photo
// The inline CSS rules are used to resize the image
//
smallImage.src = "data:image/jpeg;base64," + imageData;
// Called when a photo is successfully retrieved
//
function onPhotoURISuccess(imageURI)
// Uncomment to view the image file URI
// console.log(imageURI);
// Get image handle
//
var largeImage = document.getElementById('largeImage');
// Unhide image elements
//
largeImage.style.display = 'block';
// Show the captured photo
// The inline CSS rules are used to resize the image
//
largeImage.src = imageURI;
// A button will call this function
//
function capturePhoto()
// Take picture using device camera and retrieve image as base64-encoded string
navigator.camera.getPicture(onPhotoDataSuccess, onFail, destinationType: Camera.DestinationType.FILE_URI, quality: 50 );
// A button will call this function
//
function capturePhotoEdit()
// Take picture using device camera, allow edit, and retrieve image as base64-encoded string
navigator.camera.getPicture(onPhotoDataSuccess, onFail, destinationType: Camera.DestinationType.FILE_URI,quality: 20, allowEdit: true );
// A button will call this function
//
function getPhoto(source)
// Retrieve image file location from specified source
navigator.camera.getPicture(onPhotoURISuccess, onFail, quality: 50,
destinationType: Camera.DestinationType.FILE_URI,
sourceType: source );
// Called if something bad happens.
//
function onFail(message)
alert('Failed because: ' + message);
</script>
</head>
<body>
<button onclick="capturePhoto();">Capture Photo</button> <br>
<button onclick="capturePhotoEdit();">Capture Editable Photo</button> <br>
<button onclick="getPhoto(pictureSource.PHOTOLIBRARY);">From Photo Library</button><br>
<button onclick="getPhoto(pictureSource.SAVEDPHOTOALBUM);">From Photo Album</button><br>
<img style="display:none;width:60px;height:60px;" id="smallImage" src="" />
<img style="display:none;" id="largeImage" src="" />
</body>
</html>
【问题讨论】:
听起来您没有收到 deviceready 事件。你应该在 onDeviceReady 中放一个 console.log 看它是否被调用。 【参考方案1】:确保在 HTML 中包含正确的(最新的)cordova 文件。
我有同样的问题,我包括
cordova-1.8.0.js
而不是
cordova-2.4.0.js
【讨论】:
也就是说,确保你的代码中引用的cordova-*.js文件和你运行的一样。 为我工作!我下载了框架 zip,他们的示例使用“cordova.js”,没有版本号。【参考方案2】:你可以试试这个 使用 phonegap 拍照
<script type="text/javascript" charset="utf-8" src="cordova-2.5.0.js"></script>
<script type="text/javascript" charset="utf-8">
var pictureSource; // picture source
var destinationType; // sets the format of returned value
// Wait for Cordova to connect with the device
//
document.addEventListener("deviceready",onDeviceReady,false);
// Cordova is ready to be used!
//
function onDeviceReady()
pictureSource=navigator.camera.PictureSourceType;
destinationType=navigator.camera.DestinationType;
// Called when a photo is successfully retrieved
//
function onPhotoDataSuccess(imageData)
// Uncomment to view the base64 encoded image data
//alert(imageData);
// Get image handle
//
var smallImage = document.getElementById('smallImage');
// Unhide image elements
//
smallImage.style.display = 'block';
// Show the captured photo
// The inline CSS rules are used to resize the image
//
smallImage.src = "data:image/jpeg;base64," + imageData;
// Called when a photo is successfully retrieved
//
function onPhotoURISuccess(imageURI)
alert("inside large image")
// Uncomment to view the image file URI
// console.log(imageURI);
// Get image handle
//
var largeImage = document.getElementById('largeImage');
// Unhide image elements
//
largeImage.style.display = 'block';
// Show the captured photo
// The inline CSS rules are used to resize the image
//
largeImage.src = imageURI;
// A button will call this function
//
function capturePhoto()
// Take picture using device camera and retrieve image as base64-encoded string
navigator.camera.getPicture(onPhotoDataSuccess, onFail, quality: 50,
destinationType: destinationType.DATA_URL );
// A button will call this function
//
function capturePhotoEdit()
// Take picture using device camera, allow edit, and retrieve image as base64-encoded string
navigator.camera.getPicture(onPhotoDataSuccess, onFail,
quality: 20, allowEdit: true,
destinationType: destinationType.DATA_URL );
// A button will call this function
//
function getPhoto(source)
// Retrieve image file location from specified source
navigator.camera.getPicture(onPhotoURISuccess, onFail, quality: 50,
destinationType: destinationType.FILE_URI,
sourceType: source );
// Called if something bad happens.
//
function onFail(message)
alert('Failed because: ' + message);
</script>
</head>
<body>
<button onclick="capturePhoto();">Capture Photo</button> <br>
<button onclick="capturePhotoEdit();">Capture Editable Photo</button> <br>
<button onclick="getPhoto(pictureSource.PHOTOLIBRARY);">From Photo Library</button><br>
<button onclick="getPhoto(pictureSource.SAVEDPHOTOALBUM);">From Photo Album</button><br>
<img style="display:none;width:60px;height:60px;" id="smallImage" src="" />
<img style="display:none;" id="largeImage" src="" />
</body>
</html>
【讨论】:
【参考方案3】:我遇到了同样的问题,我通过三个步骤解决了它
javascript包括
我只使用了 cordova.js 并删除了所有 phonegap.js
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
安装插件
您必须使用命令行安装相机插件;只有xml不起作用
cordova plugin add org.apache.cordova.camera
使用正确的android-package
在您的 xml 中,您可能正在使用 org.apache.cordova.CameraLauncher
这是错误的,并且会给您 NullPointer 异常。
可以像这样包含正确的包
<feature name="Camera">
<param name="ios-package" value="CDVCamera" />
<param name="android-package" value="org.apache.cordova.camera.CameraLauncher" />
</feature>
试一试! 谢谢:)
【讨论】:
【参考方案4】:2.0.0.js 这可能会解决你的问题
你的代码是正确的,只检查这些cordova-2.0.0.js文件
【讨论】:
【参考方案5】:只需添加 <script src="phonegap.js"></script>
在我的html中为我解决了!
我还有<script src="cordova.js"></script>
,所以删除它并只保留<script src="phonegap.js"></script>
。
【讨论】:
【参考方案6】:我遇到了同样的问题。
您在代码中直接使用pictureSource.PHOTOLIBRARY
和pictureSource.SAVEDPHOTOALBUM
。
问题是 html 在 javascript 之前加载,然后您尝试访问 pictureSource
。但尚未指定。
您必须在应用程序完全加载时使用它(例如,在documents.ready 中使用jQuery 事件或在javascript 中使用其他替代方法)
【讨论】:
以上是关于适用于 Android 的 PhoneGap 相机 API - 未捕获的异常的主要内容,如果未能解决你的问题,请参考以下文章
Phonegap/Cordova Geolocation 不适用于 Android 4.0+,但适用于所有其他平台
覆盖 Android Backbutton 行为仅适用于具有 PhoneGap 的第一页