monacaでinputタグを設置したところ、iOSでは問題なく動くのに
Androidでは「カメラ」機能が利用できないということがありました。
暫くはまっていたので覚え書きです。
###詳細
inputタグを指定すると、iOSの方は「カメラ」や「アルバム」等の選択肢が出てきますが、
Androidでは「カメラ」だけ出てきませんでした。
調べるとAndroid7以降ではinputタグで「カメラ」機能が使えない場合があるそうです。
今回はAzureに画像を送信する際にこのinputに引っかかっていました。
カメラプラグインを利用し、取得した画像をAzureに送信できる形に変換するという方法でうまく動きました。
inputタグ自体使えないのは未解決のままです。
良い方法があれば教えてください。
###やろうとしていたこと
inputで取得した画像をAzureにアップロード
###やってみてダメだったこと
Crosswalk→サポート終了(今確認したらまたサポート戻ってるっぽい?要調査)
CameraAPIで取得した画像をinputタグのvalueに書き込む→セキュリティ上の問題で不可
カメラプラグインでbase64の画像データを取得してバイナリデータにデコード→うまくいかない
##上手くいった方法
inputやめてカメラプラグインでカメラ起動→Blob変換
●●カメラプラグイン部分●●
// カメラ準備
var options = {
destinationType: Camera.DestinationType.DATA_URL,
encodingType: 0 // 0=JPG 1=PNG
};
// カメラ起動
navigator.camera.getPicture(onSuccess, onFail, options);
// 成功時処理
function onSuccess (imageData) {
// Blobを作成
var byteCharacters = toBlob(imageData);
// Azureに画像データを送る関数
azureFunc(byteCharacters);
}
// エラー時処理
function onFail (message) {
console.log (message);
}
// Blob作成関数
function toBlob(base64) {
var blob;
var bin = atob(base64.replace(/^.*,/, ''));
var buffer = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) {
buffer[i] = bin.charCodeAt(i);
}
// Blobを作成
try{
blob = new Blob([buffer.buffer], {
type: 'image/png'
});
}catch (e){
return false;
}
return blob;
}
●●azureに送る関数のajax部分周辺●●
function azureFunc(file){
var YOUR_KEY = "xxxx"; // xxxxは取得したサブスクリプションキー
var area = "xxxx"; // xxxxは選択したサーバが設置されている地域
var subscriptionKey = YOUR_KEY;
var uriBase = "https://" + area + ".api.cognitive.microsoft.com/face/v1.0/detect";
var params = {
"returnFaceId": "true",
"returnFaceLandmarks": "false",
"returnFaceAttributes": "age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise",
};
$.ajax({
url: uriBase + "?" + $.param(params),
// Request headers.000
beforeSend: function(xhrObj){
xhrObj.setRequestHeader("Content-Type","application/octet-stream");
xhrObj.setRequestHeader("Ocp-Apim-Subscription-Key", subscriptionKey);
},
type: "POST",
// Request body.
data: file,
processData: false,
})
Blob作成関数は田中様の記事から引用しています。
なんとかこれで送信できました。
(バイナリデータにデコードした時はなんでうまくいかなかったんだろう…画像データのヘッダーとか…?)
###参考サイト様
https://st40.xyz/one-run/article/145/
https://press.monaca.io/takuya/1550
https://www.hos.co.jp/blog/20180129/