0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Inputでカメラ機能が使えない(Android)

Last updated at Posted at 2018-07-27

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/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?