カテゴリーアーカイブ Android

村上 著者:村上

【Android】WebViewでLeafletのアイコンが表示されない【未解決】

タイトルにもある通り、未解決です…。
Android の WebView で地図が含まれている Web ページを表示しているのですが、何故かアイコンが表示されません。
Web ページをブラウザで表示してみると、正しく表示されるので、恐らく Android の設定かな?と思い、調べています。

 

で、試してみたのが WebSettings での設定変更です。

WebSettings|Android Developers
https://developer.android.com/reference/android/webkit/WebSettings.html

JavaScript を有効にする setJavaScriptEnabled メソッドは指定されていたので、それ以外を調査。
で、他の記事を参考にしながら、下記の 3つを追加しました。

webSettings.setAllowFileAccessFromFileURLs(true);
webSettings.setAllowUniversalAccessFromFileURLs(true);
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);

上記の設定では、file スキームによるアクセスを許可にし、https/http 混在コンテンツを表示できるようにしています。
…が、これでもダメでした…。

ブラウザ上では発生しない、「Uncaught ReferenceError: jQuery is not defined.」エラーがあったので、てっきり何かがブロックされているのが原因かと思ったのですが…。
次は jQuery のエラーから攻めてみたいと思います。

 

以上、Android の WebView で地図が含まれている Webページを表示できないエラーでした。
引き続き調査し、解決出来たら改めて紹介したいと思います。

  • この記事いいね! (0)
asaba 著者:asaba

【android】機内モードを使って消失した現在地アイコンを復活させた話

gpsを使って現在地を読み取るアプリを作っていたのですが、今まで普通に映っていた現在地アイコンが急に消えてしまう事案に

遭遇しました。プロジェクトクリーンやリビルドも何回かしたのですが依然アイコンは消えたまま・・・!

ここまでコードをロールバックしても動かなかったので、視野を広げて飛行機ちゃんこと機内モードに白羽の矢を立てました。

機内モードにするとbluetoothやwi-fiといった通信機能が一時的に使えなくなります。こいつをタップして一度全てリセットした状態でも

う一回起動してみようと思い試してみました。が変わらず・・・。さてどうしましょうと考えていたらなんといきなり現在地アイコンが復活しました!

読み込みに時間がかかっていただけのようで、その後何回か再起動したのですが問題なく現在地アイコンを出すことができました。

iphoneユーザーですからっていい訳は死んでも使いたくないのでここで解決できて本当に助かりました。

設定方法→①まずホーム画面に戻ります。②上から下にスワイプすると、下のような画面が出てきます。③左下にある機内モード(飛行機のマーク)を押します。すると、wi-fi、bluetooth、位置情報といった通信手段が一斉遮断され、アプリなどの連携を断ち切ります。

ここで、もう一回機内モードを押して停止させましょう。すると、今までオフだった通信手段が全部白色になりオンの状態に

なります。とりあえずこれで解決・・・・。

 

 

コードやライブラリ周りを見てもまだ現在地が出てこなかった場合は、こちらが怪しいと目をつけてみてください。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】cordova-plugin-media使用時の音楽ファイルパスの指定について

dちょっとハマりかけたので、備忘録としてまとめ。
昨日ご紹介した、Cordova アプリで音楽ファイルを扱うためのプラグイン「cordova-plugin-media」の音楽ファイルのパスの指定方法についてです。

なお、昨日の記事はこちらから。

【Cordova】音声ファイルを扱うためのプラグイン「cordova-plugin-media」

 

で、ハマりかけたのは、Android での音楽ファイルのパスの指定方法についてです。
単純に、画像ファイルなんかと同じように、www ディレクトリ以下のパスを指定すればOKかと思ったら、それでは動かず、Code: 1 のエラーが発生しました。
なお、エラーコード 1 は、MediaError.MEDIA_ERR_ABORTED というエラーとのことです。
Aborted は「中止」という意味なので、エラーで途中で中断したという感じかな?

で、色々検索したところ、下記の記事がヒットしました。

【Monaca】Mediaプラグインを使う時に気をつけたいこと【Cordova】|webico
https://blog.webico.work/monaca-cordova02

その中で、下記のようにファイルパスを取得している関数があり、それを音楽ファイルの頭につけていたので、それを参考に修正しました。

// パス取得の関数
function getPath() {
    let str = location.href;
    let i = str.lastIndexOf('/');
    return str.substring(0, i+1);
}

私の場合、Android の時は音楽ファイルの頭に file:///android_asset/www/ を付けるようにしたら問題なく動作するようになりました!
なお、iOS の場合、単に www ディレクトリからのパスだけでOKだったので、cordova-plugin-device を利用して、プラットフォームごとに処理を切り替えるようにしましょう。

最終的なコードは下記のようになりました。

playMedia() {
  let src = '[www からの音楽ファイルのパス]';
  if (window.device.platform == 'Android') {
    src = 'file:///android_asset/www/' + src;
  }
  let media = new window.Media(src);
  media.play();
}

なお、前の記事でも書きましたが、Android の場合はリリースの処理をきちんと行いましょう。
私は…今から追加します。

 

以上、cordova-plugin-media の音楽ファイルのパスの指定方法でした。
お困りの方がいましたら、参考にしていただければと思います。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】音声ファイルを扱うためのプラグイン「cordova-plugin-media」

Cordova アプリで効果音を出したいという要望があったので、メディアプラグイン「cordova-plugin-media」をインストールしました。
HTML5 の audio タグを使用する方法もありますが、iOS では動作しない可能性もあるとのことでしたので、プラグイン導入を選択しました。

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

GitHub – apache/cordova-plugin-media: Apache Cordova Plugin media
https://github.com/apache/cordova-plugin-media

 

実装方法ですが、まずプラグインをインストールします。

cordova plugin add cordova-plugin-media

で、下記のように使用したい音声ファイルや、成功/失敗時に実行する関数などを定義します。

const media = new Media('[音声ファイルのパス]', [成功時の処理], [失敗時の処理], [ステータス変化時の処理]);

なお、音声ファイルのパス以外はすべてオプションなので、必要がなければ定義しなくてもOKです。

あとは、呼び出したいメソッドを任意のタイミングで実行するだけ!
私は単に音楽ファイルを再生したいだけだったので、下記を実行しました

media.play();

なお、OS のオーディオリソースを開放する release メソッドもあります。

media.release();

特に Android の場合、メディア再生に割り当てることができるインスタンスの数に限りがあるため、Media リソースが不要になった場合には必ず上記を実行しましょう。

 

以上、メディアを扱うための Cordova プラグイン「cordova-plugin-media」のご紹介でした。
どなたかの参考になれば幸いです。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】「Please fix the version conflict either by updating the version of the google-services plugin」エラーの対処法

昨日紹介した、Cordova のプラグイン「google-analytics-plugin」をインストールした際に発生したエラーについてです。
ちなみに、プラットフォームは Android です。

昨日の記事はこちらから。

【Cordova】アプリのアクセス解析を行えるプラグイン「google-analytics-plugin」
https://cpoint-lab.co.jp/article/201904/9282/

 

エラー全文はこちら。

Please fix the version conflict either by updating the version of the google-services plugin (information about the latest version is available at https://bintray.com/android/android-tools/com.google.gms.google-services/) or updating the version of com.google.android.gms to 9.0.0.

Google 翻訳に突っ込んだところ、「google-servicesプラグインのバージョンを更新することで、バージョンの競合を修正してください(最新バージョンについての情報はhttps://bintray.com/android/android-tools/com.google.gms.google-services/にあります)。 またはcom.google.android.gmsのバージョンを9.0.0に更新する。」とのこと。

結果から言うと、build.gradle を下記のように修正すればOKでした。

dependencies {
    ...
    compile 'com.google.android.gms:play-services:9.0.0'
}

バージョンの競合とか面倒くさそうなことを書いてあったので、手こずるかと思いましたが、そもそも解決方法がエラーに書いてありましたね。
今まで、エラー文に書いてある解決策って動かないこともあるので、若干半信半疑で試しましたが、今回は上手くいったようです。

 

以上、「google-analytics-plugin」導入時に発生したエラーの対処法についてでした。
今回はあっさり解決できたので、よかったです。

  • この記事いいね! (1)
村上 著者:村上

【Cordova】アプリのアクセス解析を行えるプラグイン「google-analytics-plugin」

今回は、Google Analytics を Cordova アプリで使うためのプラグイン「google-analytics-plugin」についての紹介です。
そう言えば入れてなかった…と気づき、実装。

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

https://github.com/danwilson/google-analytics-plugin
https://github.com/danwilson/google-analytics-plugin

 

実装方法については、こちらのサイトが分かりやすいかと。

Google Analyticsプラグインを使ってアプリの行動分析を行おう|モナカプレス
https://press.monaca.io/atsushi/447

まず下記のコマンドでプラグインをインストールします。

cordova plugin add https://github.com/danwilson/google-analytics-plugin.git
// または
cordova plugin add cordova-plugin-google-analytics

インストールが終わったら、下記のコードを deviceready イベントのタイミングで実行します。

window.ga.startTrackerWithId('[トラッキングID]');

画面を追跡するには下記のコードを利用します。

window.ga.trackView('[画面名]')

また、ボタンを押したり、検索を実行したタイミングなどでイベントを記録したい場合には、下記のコードを追加します。

window.ga.trackEvent('Category', 'Action', 'Label', Value);

Label と Value はオプションで、Value には数値が入ります。

意外と簡単!と思ったのですが、実は最初のトラッキング ID の指定から躓いております。
Google Analytics のページで、新しいプロジェクトを追加したのですが、モバイルアプリを選択すると、「トラッキングIDの発行」ではなく「アプリの追加」になっていて、ここでは ID が取得できないのかも?
ならどこに?と探しているのですが、未だ見つけられておりません。

で、色々見て調べていたのですが、そもそも、プロジェクト作成時に Firebase のプロジェクトと連携させたんですよね。
…これは、Google Analytics ではなく、Firebase のアナリティクスを使った方が早いのでは…!
ということで、その方向で進めてみたいと思います。

 

以上、Google Analytics を Cordova アプリに導入するためのプラグイン「google-analytics-plugin」のご紹介でした。

  • この記事いいね! (0)
asaba 著者:asaba

【ButterKnife】バターナイフは明示的にgradleに書くべき

viewのメソッドを簡潔にかくことが出来るライブラリです。一般的なviewを使いたい時は、findViewByIdで紐付けるだけで使うことが

できますが、これが複数のviewとなると、同じようなコードができてしまいこれでは可読性に欠けてしまいます。

バターナイフは、このダブつくview定義を事前に定義させることでsetContentViewの下からviewの操作を可能にしてくれるので、複数の

ビューを使いたいけど管理が大変なエンジニアさんには重宝されています。こんな感じ↓

class ExampleActivity extends Activity {
@BindView(R.id.title) TextView title;
@BindView(R.id.subtitle) TextView subtitle;
@BindView(R.id.footer) TextView footer;

@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.bind(this);
// TODO Use fields...
}
}

 

今自分が開発しているアプリもバターナイフを使って管理しているのですが、グレイドル(また出たなお前)のバージョンを上げたら

やっぱりというべきかエラーに通せんぼされてしまいました。

 


Error:Execution failed for task ':app:javaPreCompileDebug'.
> Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration.
- butterknife-6.1.0.jar (com.jakewharton:butterknife:6.1.0)
Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior. Note that this option is deprecated and will be removed in the future.
See https://developer.android.com/r/tools/annotation-processor-error-message.html for more details.

訳してみました。

プロセッサは明示的に宣言されなければなりません。次のコンパイルクラスパスへの依存関係に、注釈プロセッサが含まれています。 annotationProcessor設定にそれらを追加してください。

 

どうやらバターナイフはグレイドルのバージョンに合わせてannotationProcessorとして定義しなければいけないみたいです。グレイドル

アップデート前は普通に定義しなくても使えていたのに・・・。

まあもうできたのが6年前なので仕様が変わっていても不思議じゃないですよね。という訳でannotationProcessorにバターナイフを定義してあと残り

なく解決です。

 

annotationProcessor "com.jakewharton:butterknife:6.1.0"
compileOnly "com.jakewharton:butterknife:6.1.0"

このライブラリに変わるものがすでに出てきているか分かりませんが、ライブラリとしては書くことが少なく学習コストも低いので

いとまがあれば使ってみたいと思います。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】「The versions of the Android Gradle plugin and Gradle are not compatible.」エラーの対処法

ちょっとミスをして、Cordova アプリから Android プラットフォームの削除・再追加を行ったのですが、その時に発生したエラーについて。
Android Studio のバージョンを上げたのも原因だったのかも?

Gradle のバージョンに関するエラーで、全文は下記のとおり。

ERROR: The versions of the Android Gradle plugin and Gradle are not compatible.
Please do one of the following:
Update your plugin to version 2.4. This will require changes to build.gradle due to API changes.

エラー:Android GradleプラグインとGradleのバージョンは互換性がありません。次のいずれかを行ってください。プラグインをバージョン 2.4 に更新してください。これはAPIの変更により build.gradle への変更を必要とします。」とのこと。

 

そのため、エラー文に書いてある通り、build.gradle のバージョンを更新しました。
また、Android Studio の File > Project Structure の Project でも、バージョンを確認しました。
…が、最初はどこを直していいのかわからず、いろんなところを直しては戻し、また別のところの値を変え…とやっていたら、いつのまにか直っていた感じなので、確認箇所がこれでいいのかは不明です。

一応、参考にさせていただいたサイトを挙げておきます。

[Android Studio][gradle]gradleとAndroid plugin for gradleのバージョンを合わせる
https://qiita.com/azumak/items/c48c56447a7a345f2b43

 

以上、Android Studio で Gradle のバージョンエラーが発生した際の対処法についてでした。
あまり参考にならない気もしますが…。

  • この記事いいね! (0)
asaba 著者:asaba

【androidJava】BroadcastReceiverを試しに使ってみる

BroadcastReceiverとは、何かのタイミングで端末に特定の処理を通知するときによく使われる便利なライブラリです。

軽い機能であればfirebaseよりも手軽に実装することができるので、息抜きにミニアプリを作ってみたいと思ったときに試してみて

ください。

自分が書いたコードはこんな感じに仕上がりました。まずボタンを押すと、pickerがでてきます。そのpickerを使って時間を指定して、その時間になったらトーストで時間ですよ~とお知らせするシンプルなものになっております。お休みのときにささっと書いたので情報少しが古い&コードが乱雑ですがご容赦くださいまし。

MainActivity↓

</pre>
<pre>public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TimePicker();
            }
        });
        }
        public void TimePicker(){
            final Calendar calender = Calendar.getInstance();
            int hour = calender.get(Calendar.HOUR_OF_DAY);
            int minute = calender.get(Calendar.MINUTE);

            TimePickerDialog dialog = new TimePickerDialog(
                this,
                new TimePickerDialog.OnTimeSetListener() {
                    @Override
                    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                        System.out.println(hourOfDay);
                        calender.setTimeInMillis(System.currentTimeMillis());
                        calender.add(Calendar.SECOND, 5);

                        Intent intent = new Intent(getApplicationContext(),
                                AlarmBroadcastReceiver.class);
                        PendingIntent pending = PendingIntent.getBroadcast(
                                getApplicationContext(), 0, intent, 0);
                        // アラームをセットする
                        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                        if (am != null) {
                            am.setExact(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(), pending);

                            Toast.makeText(getApplicationContext(),
                                    "Set Alarm ", Toast.LENGTH_SHORT).show();
                        }
                    }
                },
                hour,minute,true) ;
            dialog.show();
        }
}</pre>
<pre>

今回のお題であるBroadcastReceiverです。

</pre>
<pre>public class AlarmBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // ここに端末に対してしたい処理を書きます。例ではトーストになっているので変えても構わないです。
        Toast.makeText(context, "Received ", Toast.LENGTH_LONG).show();
    }
}</pre>
<pre>

マニフェストには、パーミッションでWAKE_LOCKを設定しておきます。

その後に、applicationタグのすぐ上に”AlarmBroadcastReceiver”を定義しておきます。これがないとBroadcastReceiverが反応しない

ので忘れないでくださいね。

</pre>
<pre><uses-permission android:name="android.permission.WAKE_LOCK"/></pre>
<pre><application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <receiver android:name=".AlarmBroadcastReceiver"
              android:process=":remote" />
</application></pre>
<pre>

レイアウトのほうはボタンだけなので割愛させていただきました。コードの量も少なめで実装できるので、メンテナンスにも苦労しなさそうです。おすすめです。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】カメラプラグイン利用時にOutOfMemoryErrorでアプリが落ちる時の対処法

後輩君がササッと調べてくれました!
Cordova に カメラプラグイン「cordova-plugin-camera」を導入した際、ギャラリーから選択した画像のサイズが大きすぎてアプリが落ちるというバグが発生していました。
今までは、カメラプラグインのオプションの allowEdit を有効にして、画像を正方形にトリミングしていたのですが、Android では、その方法が推奨されていないので、トリミングを行わないように変更しました。
そしたら、画像サイズが大きすぎでアプリがクラッシュ…。
なお、エラーメッセージは「OutOfMemoryError: Failed to allocate a 75497480 byte allocation with 16773216 free bytes and 59MB until OOM」というものでした。

 

で、それについてぼやいたら、後輩君が検索してヒットしたページを送ってくれました。
それがこちら。

Simon Mac Donald: Change to Camera code in PhoneGap 1.9.0
http://simonmacdonald.blogspot.com/2012/07/change-to-camera-code-in-phonegap-190.html

こちらの記事によると、「getPicture メソッドに quality や targetWidth / targetHeight などのいくつかのパラメータを指定すると、メモリ不足エラーが発生する可能性があります」とのこと。
それらを思いっきりやってる…!ということで、記事に掲載されていたサンプルコードを見本に、コードを下記のように修正しました。

const options = {
    quality: 100,
    correctOrientation: true,
    saveToPhotoAlbum: true,
    destinationType: navigator.camera.DestinationType.DATA_URL,
    sourceType: navigator.camera.PictureSourceType.CAMERA,
    encodingType: navigator.camera.EncodingType.JPEG,
};
navigator.camera.getPicture((imageData) => {
    // 成功時の処理
}, (error) => {
    // 失敗時の処理
}, options);

quality は 100 のまま、encodingType を JPEG 形式に変更し、targetWidthtargetHeight は定義しないようにしました。
この状態で実行したところ、アプリが落ちなくなり、無事にカメラで撮影した画像データが取得できました!
また、sourceType を CAMERA から PHOTOLIBRARY に変更しても問題ありませんでした。

 

以上、Cordova のプラグイン「cordova-plugin-camera」利用時に、OutOfMemoryError でアプリが落ちる時の対処法でした。
というか、そもそも写真は PNG ではなく、JPEG で保存すべきでしたね…。
同じような現象にお悩みの方は、是非参考にしていただければと思います。

  • この記事いいね! (0)