著者アーカイブ 村上

村上 著者:村上

【Cordova】Abobeの画像加工機能を実装できるプラグイン「phonegap-plugin-csdk-image-editor」

本来ならばこちらの記事を先に投稿するべきだったかも…。

昨日の記事で、「phonegap-plugin-csdk-image-editor」というプラグインを導入した際に遭遇したエラーについての対処法について紹介しましたが、今日はそのプラグインの導入方法についてです。

GitHub のページはこちらから。

GitHub – CreativeSDK/phonegap-plugin-csdk-image-editor: A PhoneGap plugin for the Creative SDK Image Editor.
https://github.com/CreativeSDK/phonegap-plugin-csdk-image-editor

 

実装方法ですが、まずは本命のプラグインを導入する前に phonegap-plugin-csdk-client-auth プラグインをインストールする必要があります。
で、その際に、各プラットフォームの クライアントIDクライアントシークレットが必要になるので、下記の URL から登録する必要があります。

Adobe I/O Console
https://console.adobe.io/integrations

あとは上記で登録した ID などを使って、下記のコマンドを実行します。

cordova plugin add --save phonegap-plugin-csdk-client-auth --variable CSDK_CLIENT_ID_IOS="[iOS のクライアントID]" --variable CSDK_CLIENT_SECRET_IOS="[iOS のクライアントシークレット]" --variable CSDK_CLIENT_ID_ANDROID="[Android のクライアントID]" --variable CSDK_CLIENT_SECRET_ANDROID="[Android のクライアントシークレット]"

こちらの実行が完了したら、下記のコマンドを実行し、画像加工用のプラグインをインストールします。

cordova plugin add --save phonegap-plugin-csdk-image-editor

準備はこれで完了です。
あとは、任意の場所で下記のコードを実行すればOKです。

function success(newUrl) {
    // 画像加工が成功した時の処理
    console.log("Success!", newUrl);
}
function error(error) {
    // 画像加工が失敗した時の処理
    console.log("Error!", error);
}

var imageUrl = "[加工したい画像のURI]";
var options = {
    outputType: CSDKImageEditor.OutputType.JPEG,
    tools: [
        CSDKImageEditor.ToolType.EFFECTS,
        CSDKImageEditor.ToolType.CROP
    ],
    quality: 50
};
// エディターを起動
CSDKImageEditor.edit(success, error, imageUrl, options);

メソッドやオプションについてのガイドは下記からご確認頂けます。

API guide
https://github.com/CreativeSDK/phonegap-plugin-csdk-image-editor/blob/master/docs/api.md

 

以上、Adobe Creative SDK の画像加工機能を実装できるプラグイン「phonegap-plugin-csdk-image-editor」のご紹介でした。
ただし、昨日の記事でも書きましたが、別途ライブラリの追加が必要なのでご注意ください。

村上 著者:村上

【Cordova】「phonegap-plugin-csdk-image-editor」プラグイン導入時に遭遇したエラーの対処法

今回は、Cordova のプラグイン「phonegap-plugin-csdk-image-editor」を導入しようとした際に遭遇したエラーです。
なお、現在も違うエラーに苦戦中…。
…既存のコードを修正したほうが早いかもしれません。

エラーメッセージは「java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/os/AsyncTaskCompat;」です。
ちなみに、Android Studio で実行した際表示されたエラーメッセージ冒頭に書かれているエラーは「java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/os/BuildCompat;」でしたが、そちらではなく「java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/os/AsyncTaskCompat;」で検索したところ有効な記事にたどり着けました。

今回参考にさせていただいた記事はこちら。

android – java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/os/BuildCompat – Stack Overflow
https://stackoverflow.com/questions/39601370/java-lang-noclassdeffounderror-failed-resolution-of-landroid-support-v4-os-bui

 

で、対処法ですが、「support/v4/os/AsyncTaskCompat」関連のファイルが参照できないことが問題なので、手動で追加すればOKです。
下記の画像のように、java ディレクトリの直下に android.support.v4.os というディレクトリを作成します。

あとは、作成したディレクトリ内に、AsyncTaskCompat.javaAsyncTaskCompatHoneycomb.java のファイルを下記のコードで作成します。

AsyncTaskCompat.java

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package android.support.v4.os;
import android.os.AsyncTask;
import android.os.Build;
/**
 * Helper for accessing features in {@link android.os.AsyncTask}
 * introduced after API level 4 in a backwards compatible fashion.
 */
public final class AsyncTaskCompat {
    /**
     * Executes the task with the specified parameters, allowing multiple tasks to run in parallel
     * on a pool of threads managed by {@link android.os.AsyncTask}.
     *
     * @param task The {@link android.os.AsyncTask} to execute.
     * @param params The parameters of the task.
     * @return the instance of AsyncTask.
     */
    public static <Params, Progress, Result> AsyncTask<Params, Progress, Result> executeParallel(
            AsyncTask<Params, Progress, Result> task,
            Params... params) {
        if (task == null) {
            throw new IllegalArgumentException("task can not be null");
        }
        if (Build.VERSION.SDK_INT >= 11) {
            // From API 11 onwards, we need to manually select the THREAD_POOL_EXECUTOR
            AsyncTaskCompatHoneycomb.executeParallel(task, params);
        } else {
            // Before API 11, all tasks were run in parallel
            task.execute(params);
        }
        return task;
    }
    private AsyncTaskCompat() {}
}

AsyncTaskCompatHoneycomb.java

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package android.support.v4.os;
import android.os.AsyncTask;
/**
 * Implementation of AsyncTask compatibility that can call Honeycomb APIs.
 */
class AsyncTaskCompatHoneycomb {
    static <Params, Progress, Result> void executeParallel(
            AsyncTask<Params, Progress, Result> task,
            Params... params) {
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    }
}

上記 2つのファイルが作成出来たら、アプリを一度 Clean してから Build → 実行してください。
私の環境では、問題なく動作しました!

 

以上、「phonegap-plugin-csdk-image-editor」プラグインを導入時に遭遇したエラー「java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/os/AsyncTaskCompat;」の対処法でした。
「phonegap-plugin-csdk-image-editor」プラグインの導入方法そのものについては、後日ご紹介する予定です。

村上 著者:村上

【JavaScript】Ajaxを使わない非同期通信処理「XMLHttpRequest」の書き方

自分のための備忘録としてまとめ。
Ajax のかわりに XMLHttpRequest を使って非同期通信の処理を行う方法です。
普段、Ajax に頼りきりで、書き方をすっかり忘れていたので、今後のためにまとめておきます。

今回参考にさせていただいた記事はこちらから。

XMLHttpRequestによるPOSTメソッド|JavaScript プログラミング解説
https://so-zou.jp/web-app/tech/programming/javascript/ajax/post.htm

JavaScript によるフォームの送信 – Web 開発を学ぶ|MDN
https://developer.mozilla.org/ja/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript

 

早速ですが、サンプルコードは下記のとおりです。
なお、サンプルは POST の場合の書き方です。

// POSTメソッドで送信するデータ
var data = { param1: 'abc', param2: 100 }; 
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest .addEventListener('load', function(event) {
    // データが正常に送信された場合の処理
});
xmlHttpRequest .addEventListener('error', function(event) {
    // エラーが発生した場合の処理
});
xmlHttpRequest.open('POST', '[送信先URL]');
// サーバに対して解析方法を指定する
xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// データをリクエスト ボディに含めて送信する
xmlHttpRequest.send(EncodeHTMLForm(data));

一緒に送信したいデータは、変数 data に代入し、14行目で送付しています。
ただし、送信するデータは HTML フォームの送信に使用される形式に変換する必要がありますので、下記の関数でエンコードする必要があるとのことでした。

function EncodeHTMLForm(data) {
    var params = [];
    for(var name in data) {
        var value = data[ name ];
        var param = encodeURIComponent(name) + '=' + encodeURIComponent(value);
        params.push(param);
    }
    return params.join('&').replace(/%20/g, '+');
}

うっかりこの処理を抜いて実行したところ、当然ながら正しく値が渡せていなかったため、ご注意ください。

送信完了時の処理と、エラーが発生した時の処理は、それぞれ 4行目と 7行目の関数内で定義します。
ステータスコードなどで判断する方法もありましたが、こちらの方がコードがすっきりとしていて好みなので、こちらの書き方を採用しました。

 

以上、Ajax を使わずに非同期通信処理を行う方法でした。
ご参考になれば幸いです。

村上 著者:村上

【Android】「Duplicate class android.support.v4.app.INotificationSideChannel found in modules classes.jar (androidx.core:core:1.0.0) and classes.jar (com.android.support:support-compat:27.0.2)」エラーの対処法

長々としたタイトルですが、今回は Android Studio で発生したエラーについてです。
なお、ネイティブアプリではなく、Cordova で開発したアプリです。
エラーメッセージはもっと長かったので割愛します。

今回参考にさせていただいた記事はこちらから。

gradle – Duplicate class android.support.v4.app.INotificationSideChannel found in modules classes?
– Stack Overflow

https://stackoverflow.com/questions/55909804/duplicate-class-android-support-v4-app-inotificationsidechannel-found-in-modules/55932544

こちらの記事にはエラーメッセージが掲載されていますが、まさしくこのような感じのメッセージでした。
そしてこれだけでは何をどう直していいのかが分からない…。

 

さて、解決方法ですが、gradle.properties というファイルに下記の 2行を追加するだけです。

android.useAndroidX=true
android.enableJetifier=true

ただ、私の環境では gradle.properties がなかったので、作成してから追加しました。
なお、作成するときは、プロジェクト直下のファイルを右クリックし、表示されたメニューの New > File から作成しました。
画面イメージは下の画像のとおりです。

あとは、普段通りビルドをしたところ、発生していたエラーが解消されました。

…が、あとになって、不要なプラグイン「cordova-plugin-firebase」を削除して再度実行したところ、エラーそのものが発生しなかった模様…。
たまにやってしまうのですが、不要なプラグインはすぐに消すようにしたほうが良さそうですね。

 

以上、Android Studio で発生したエラーの対処法でした。
エラーメッセージが長い&意味がわかりにくいのでとりあえず検索しましたが、有効な解決方法がヒットしてよかったです。
ご参考になれば幸いです。

村上 著者:村上

【Android】LinearLayoutで囲んだページをスクロールさせる方法

Android アプリを修正中に、LinearLayout で囲った要素をスクロールさせたかったので、その対処法です。
…というか、LinearLayout って要素がいくら増えてもスクロールしない仕様なのですね。
今後もうっかりこの仕様を忘れて「あれ?」となる未来が見えそうなので、忘れないようにしなければ。

今回参考にさせていただいた記事はこちらから。

LinearLayout をスクロールさせる方法(ScrollViewの使用方法) – [サンプルコード/Androidアプリ] ぺんたん info
http://pentan.info/android/app/sample/linear_scroll.html

 

対処方法としましては、スクロールさせたい LinearLayout を ScrollView で囲むだけです。
サンプルコードは下記のとおりです。

<ScrollView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_height="fill_parent"
  android:layout_width="fill_parent">
  <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <!-- 表示したい要素 -->

  </LinearLayout>
</ScrollView>

XMLファイルに記述する場合、上記のようにすれば、ページをスクロールすることができます。

なお、参考サイトでは、Activity のファイルで指定する方法についても掲載されておりますので、お好きな方法を採用してください。
個人的には、XML ファイルに追加する方法の方が楽だし分かりやすいと思います。

使用する際の注意点としましては、ScrollView は指定する子要素が 1つでなければいけないということが挙げられます。
なので、複数の要素をスクロールさせたい場合は、LinerLayout などのレイアウト要素を用いて、複数の要素を 1つにまとめる必要があります。

また、上記の方法では縦スクロールが有効になりますが、もし横スクロールを行いたい場合は、ScrollViewHorizontalScrollView に変更してください。

 

以上、Android の LinerLayout をスクロールさせる方法でした。
皆様は、私のようにうっかり仕様を忘れてしまわないようにご注意ください。

村上 著者:村上

【Excel】セルに値が入力されているかを判定する方法

久しぶりに使おうとして関数名を忘れてしまっていたので、備忘録として。
Excel で セルが入力されているか、もしくは空なのかを判定する方法です。
使用するのは「ISBLANK」という関数です。

参考にさせていただいた記事はこちらから。

エクセル ISBLANK 関数:セルが空白か判定する
https://www.tipsfound.com/excel/04isblank

 

関数の使い方自体はとても簡単で、式は下記のとおりです。

=ISBLANK([空判定をしたいセル])

なお、こちらの関数は指定したセルが空だったら TRUE を返し、何か値が入っていたら FALSE を返します。

この関数は IF 関数と一緒に用いることが多いと思います。
例えば、「セルが空だった時」と「空でなかった時」に処理を分けたいときに使えます。

=IF(ISBLANK([空判定をしたいセル]),[セルが空の場合の処理],[セルが空でない場合の処理])

サンプルコードは上記のとおりです。
この書き方を使えば、お店のセールなどでよくあるような「5,000円以上お買い上げで、10% オフ」という処理も簡単に書けます。
…まあ、Excel で実際に行う処理かどうかはわかりませんが…。

 

以上、Excel でセルが空かどうかを判定する方法でした。
私的には、頻繁には使わないけど思い出した時に使う関数だと思っているので、覚えておくと便利だと思います。

村上 著者:村上

【Android】「Could not find com.android.tools.build:aapt2:3.4.2-5326820.」エラーの対処法

1年ほど前に開発したアプリを起動した際に遭遇したエラーについてです。
エラーメッセージは「Could not find com.android.tools.build:aapt2:3.4.2-5326820.」というもので、これだけでは意味が分かりません…。
なので、そのまま Google 検索にかけたところ、下記の記事がヒットしました。
若干エラーメッセージが異なりましたが、こちらの対処法で解消できました。

参考にしたサイトはこちら。

[Android]「Could Not Find com.android.tools.buildaapt2:3.2.0-4818971」という謎のエラーが出てビルドできない場合の対処法
https://minpro.net/could-not-find-com-android-tools-buildaapt2

 

こちらの記事によると、Android Studio のバージョンを挙げた時に発生するエラーのようです。
確かに、開発した当時とは Android Studio のバージョンは異なっているはずです。

で、解決方法ですが、build.gradle の中に google() を追加すればOKです。
追加箇所は下記のとおりです。

...
allprojects {
    repositories {
        google()  // こちらを追加
        jcenter()
    }
}
...

あとは、build.gradle を更新したので、Sync Now を実行し、通常通りビルド・実行をします。
私の環境では上記の追加のみで解決できました!

なお、こちらのエラーの原因ですが、参考サイトによると「Android Studio が 3.2 にバージョンアップされたとき、「AAPT2」というツールの提供元が変更されたことが原因」とのことでした。

 

以上、Android Studio にて「Could not find com.android.tools.build:aapt2:3.4.2-5326820.」エラーが発生した時の対処法でした。
参考になれば幸いです。

村上 著者:村上

【Android】「Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.」エラーの対処法

先日報告があったため修正した、Android アプリの不具合です。
WebView のページを開いたところ、何も表示されず真っ白なページになってしまいました。

で、Android Studio で表示されたエラーメッセージは、タイトルにもある通り「Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.」というもので、「証明書チェーンの検証に失敗しました」とのこと。

このエラーは証明書の設定が間違っていることが考えられるので、一度証明書の設定を確認してください。

 

ですが、テスト用の証明書だったりするなど、直すのが難しいことがあるかと思います。
そんな時には、強制的にエラーをスキップする方法があります。

参考にしたサイトはこちらから。

Y.A.M の 雑記帳: Android WebView で https のサイトにアクセスして白画面になるのを避ける方法
http://y-anz-m.blogspot.com/2012/08/androidwebview-https.html

ssl – Android error in webview.loadUrl() – Trust anchor for certification path not found – Stack Overflow
https://stackoverflow.com/questions/33825696/android-error-in-webview-loadurl-trust-anchor-for-certification-path-not-fou

ただし、セキュリティ上は問題があるので、なるべく使わないほうがいいです。
あくまでも、緊急時の対処法ということにしておいてください。

対応方法ですが、WebViewClient を継承しているクラスがあると思うので、そこに下記のコードを記述します。

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError er) {
    handler.proceed(); 
}

上記を指定すると、SSL でエラーが発生しても無視をしてくれますので、問題のあるWebページでも問題なく表示されます。

 

以上、Android の WebView で SSL 証明書にエラーがある Web ページを表示する方法でした。
ただし、再度繰り返しますが、あくまでも応急処置ですので、リリースするアプリには導入しないことをお勧めします。

村上 著者:村上

【Android】現在の位置情報を偽装できるアプリ「Fake GPS location」

アプリ開発の際に、位置情報を偽装したいことがあると思います。
そんな時におすすめの Android アプリが「Fake GPS location」です。
言語は英語なのですが、直感的な操作で使えるので、特に支障はありません。

インストールはこちらから。

Fake GPS location – Google Play のアプリ
https://play.google.com/store/apps/details?id=com.lexa.fakegps&hl=ja

 

使い方ですが、アプリを起動すると画面に地図とマップピンのアイコンが表示されるので、まずは画面をスワイプして偽装したい場所にアイコンが来るように調整します。

上の画像では、浜松駅をマップピンに合わせています。
あとは、右下にある三角アイコンの緑ボタンを押せば、設定は完了です!
位置情報を取得してみると、このアプリで設定した場所にいるように表示されるかと思います。
なお、このアプリを起動中は、端末の通知バーに常にアイコンが表示されています。
うっかり消し忘れることもなくて便利です。
また、一時停止は通知バーからも操作できます。

端末によっては、設定から「仮の現在地情報アプリを選択」や「疑似ロケーションアプリ」という項目で Fake GPS アプリを選択する必要がある場合もありますが、その際はきちんと通知してくれるので、それに従って設定しましょう。
なお、上記の設定は、設定 > 開発者向けオプション > 仮の現在地情報アプリを選択(または疑似ロケーションアプリ) という場所にあります。

 

以上、Android 端末で現在の位置情報を偽装する方法でした。
位置情報で、機能の ON/OFF を判断していたりすると、動作検証がなかなか難しかったりしますが、こちらを利用すればかなり簡単に動作を確かめられますね!
くれぐれも悪用せず、便利にお使いください。

村上 著者:村上

【サービス】画像を送ると文字起こししててくれるLINEアカウント「文字起こしばりぐっどくん」

とても便利なサービスを紹介している記事を見つけたので、共有&備忘録のためにまとめ。

読んだ記事はこちらから。

LINEに画像を送ると、AIが3秒で文字起こし 「企業や役所の働き方変える」 長崎のベンチャーが開発 – ITmedia NEWS
https://www.itmedia.co.jp/news/articles/1907/11/news110.html

 

長崎県西海市のベンチャー企業「西海クリエイティブカンパニー」が7月3日からLINE上で公開しているサービスで、LINE アカウント「文字起こし ばりぐっどくん」です。
こちらは友達申請をするとすぐ使え、文字起こしをしたい画像を送ると、数秒でテキストを返してくれるのだとか。
手書き文字は分かりませんが、名刺などの印字されているものでしたら問題なく変換ができるとのこと。
チラシなどの紙媒体に記載されたデータの取り扱いがかなり便利になりそうですね!
また、役所などの紙を扱うことが多いお仕事ではとても役立ちそうですね。
幸い、紙データを扱うことはそこまで多くありませんが、たまに紙データからテキストを抜き出したいことがあるので、使う頻度はそこそこありそうです。

なお、こちらのサービスですが、非エンジニアの担当者の方が、約1週間で作り上げたものとのこと。
文字起こしには、Google Cloud Platform の画像認識サービス「Cloud Vision」を使用しているそうです。
面白そうなので、時間があれば是非触ってみたいですね!

 

以上、画像から文字を起こしてくれるLINEアカウント「文字起こし ばりぐっどくん」のご紹介でした。
いざというときに便利そうなので、この後にでも友達申請をしておこうと思います。