カテゴリーアーカイブ Java

村上 著者:村上

【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.」エラーが発生した時の対処法でした。
参考になれば幸いです。

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

【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 ページを表示する方法でした。
ただし、再度繰り返しますが、あくまでも応急処置ですので、リリースするアプリには導入しないことをお勧めします。

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

【java】HasuMapを使ってキーと値を一緒に取得する※自分用

javaにはphpのようにforeachで回す手段が無く、代わりに拡張for文を使ってキー・値を取得する方法が用意されています。

例えば、hasumap配列に格納したキーと値を取り出すには以下のようにentrySet・getKey・getValueを使って取り出すことができます。

</pre>
import java.util.HashMap;
import java.util.Map;

public class Main {

public static void main(String[] args) {

Map<String, String> map = new HashMap<>();
map.put("name", "asaba");
map.put("job", "programmer");

for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}
<pre>

hashmapを使う時はimportでimport java.util.HashMap;とimport java.util.Map;と定義しないとno such no fileのエラーが

出るのでそこは注意しなければですね。

片方だけ取ってくる方法も存在するのでそこは作りたいものに合わせて調整する必要があります。(簡単ですが)

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

【java】javaにおけるコンストラクタの使い方・おさらい

javaでコンストラクタの使い方がわかってきてもう怖いものはないと思っていましたが、いずれまたすぐ忘れるかもなので自分用に

とっておきます。コンストラクタは、インスタンスを作る時に初期値を設定するために呼び出されるメソッドのことで、クラス名と

必ず同じ名前でなければなりません。また、コンストラクタのメソッド内でreturnを書いても死ぬのでここも注意ですね。

知らないうちはそんなのメンバ変数を適当に定義しとけばいいじゃんと思っていましたが、コードが大きくなるにつれ結局メンテナンス

が大変になって汚いコードになることを知ったのでまた使い方をおさらいしていたところです。理屈で知っていても何のために使う

か実際に書いて理解していないとわかったつもり状態になってしまうのでここにきてサンドボックスで少し復習しました、はい。

次のプログラムは、コンストラクタのメソッドに決められた文字を設定して、superでスーパークラスのコンストラクタを利用して

それぞれ異なる結果を出力するプログラムです。

 

</pre>
// スーパークラス
class ClassSuper {
protected int i;

public ClassSuper(str i){
this.i = i;
}

public void favarite(){
System.out.println("私は" + i + "が好きではありません。");
}
}
// サブクラス
class ClassSub extends ClassSuper{
public ClassSub(str i) {
super(i);
}

@Override
public void favarite(){
System.out.println("私は" + i + "が好きです。");
super.favarite();
}
}

public class Main {

public static void main(String[] args) {
ClassSub cs = new ClassSub("カレーライス");
cs.favarite();
}

}
<pre>

コンストラクタにカレーライスという文字を設定しています。何も設定しない場合は、スーパークラスをオーバーライドしている

サブクラスのメソッドを呼び出すのですが、今回はコンストラクタメソッド内でsuperメソッドを呼び出しています。このsuperメソッド

は、オーバーライドしているサブクラスのメソッドでないスーパークラスのメソッドを使いたい時に用いるメソッドです。

これを呼び出すことにより、”カレーライス”文字列はスーパークラス・サブクラス二つのクラスのコンストラクタとして初期値に設定され

それぞれ違うメソッドを呼び出すことに成功しています。

 

 

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

【java】オーバーロードを使ったポリモーフィズムの書き方

今回は、ポリモーフィズムの話題です。

ポリモーフィズムとは、定義された同じ名前のメソッドを使ってクラスごとに全く違う振る舞いを

入れこむことができる概念で、、多様性という意味を持ちます。

今回は、オーバーロードの書き方に沿ったポリモーフィズムをさっと書いてみました。

※「オーバーロード」とは、一つの「クラス」の中に、同じ名前で引数が違うメソッドがある状態のことを指します。

このオーバーロードに沿って簡単な計算をするプログラムを書くとこんな感じに仕上がります。

</pre>
<pre>class calculator{
  public void calc(int x) {
    System.out.println("x * x = " + (x * x));
  }
  public void calc(int x, int y) {
    System.out.println("x * y = " + (x * y));
  }
}

class plusCalc{
  public static void main(String[] args) {
    calculator hoge = new calculator();
    hoge.calc(int 4,2)
    hoge.calc(int 2)
}
</pre>
<pre>

スーパークラスcalculatorのインスタンスを定義してcalcメソッドを使用可能にしています。その後に

引数が異なるメソッドを二つ定義しているのがわかります。ここの引数が異なるのがポイントで、

引数によってどのメソッドに処理をさせるかを識別してからメソッドを呼び出しています。

この識別されるメソッドと引数を全部ひっくるめてシグネチャと呼びます。

オーバーロードをこのポリフォーリズムの書き方に当てはめることで、このシグネチャによって

どれだけ同じメソッドを書いても引数によってその処理を柔軟に変えることが出来るのです。

以上です。

オーバーライドを使ったポリモーフィズムもあるのですが、うろ覚えで自信がないのでまたまとまった時に書きます。

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

【android】Could not resolve all files for configuration ‘:app:debugCompileClasspath’の解消法

タイトルの通りですが、クラスパスがないのでビルドできません的なエラーです。原因は’com.android.tools.build:gradle:●.●.●’の

●●の部分がグレイドルのバージョンと合っていなかったりandroid support libraryをインストールしていなかったりと多岐に渡りますが、

自分の場合はただ一行追加するだけでおとなしくなってくれました。それがこちらです。

 

<pre>repositories {
    google()←これをjcenter()の上に追加するだけ
    jcenter()
}</pre>

 

build.gradleにあるallprojectsスコープとrepositoriesスコープ内にgoogle()を追加してください。

 

android support libraryを使っているならこれを必ず追加しろということだと思います。順番は先頭にしないと警告が出るので

とりあえず一番先頭においておけば間違いはないはず。

自分の場合はこちらで解決しましたが、中にはsdkmanagerのsdktoolをアンインストールして再度インストールしないと消えない

ケースもあったので(スタックオーバーフロー参照)これが参考になるか分からないですが

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

【Android】FCM導入時にFirebaseInstanceIdServiceがエラーになった時の対処法

Cordova アプリを開発中に遭遇した FCM のエラーについて。
ちょっとしたトラブルで、一度プラットフォームを削除し、cordova-plugin-fcm を再インストールしたところ、Android Studio でアプリを起動した際にエラーが発生しました。
なんでも、FirebaseInstanceIdService が廃止予定で、使用が非推奨になったためでした。

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

FirebaseInstanceIdServiceがDeprecatedになった件 – Qiita
https://qiita.com/keijumt/items/d45ea0da3dfa6284ad90

 

対処法としては、まず非推奨の FirebaseInstanceIdServiceFirebaseMessagingService に置き換えます。
私の環境では、別のクラスに extends で継承されていたため、こちらを下記のように書き換えました。

public class MyFirebaseInstanceIDService extends FirebaseMessagingService {
    ...
}

次に、MyFirebaseInstanceIDService クラス内で、onTokenRefresh() をオーバーライドしていたのですが、FirebaseMessagingService では、この関数のかわりに onNewToken() が用意されているので、こちらも変更します。

public class MyFirebaseInstanceIDService extends FirebaseMessagingService {
    @Override
    public void onNewToken(String old_token) {
        ...
    }
}

さらに、onNewToken()(旧 onTokenRefresh())内では、FirebaseInstanceId.getInstance().getToken() が使われていましたが、こちらも非推奨らしく、コードに打ち消し線が引かれてしまったため、併せて修正します。
と言っても、引数を追加して、try/catch で囲むだけなんですけどね。
修正後のコードは下記のとおりです。

String sender_id = [FCM の送信者ID(数字12桁)];
String refreshedToken = null;
try {
    refreshedToken = FirebaseInstanceId.getInstance().getToken(sender_id, "FCM");
} catch (IOException e) {
    e.printStackTrace();
}

修正は以上で完了です。
あとは、通常通り Build → Run を実行したところ、エラーも発生せず、問題なく起動できました。
ただ、その時は起動確認だけを行っただけなので、FCM の機能については、これから入念にチェックしたいと思います。

 

以上、FCM の FirebaseInstanceIdService がエラーになったときの対処法でした。
導入したプラグイン等については、定期的に関数の廃止などをした方が良さそうですね。

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

【Android】Google Chromeを使ってWebViewページのデバックを行う方法

今後も使えそうだと思ったので、備忘録としてまとめ。
Google Chrome ブラウザを使って Android の WebView ページをデバックする方法についてです。
ブラウザ 上で見ると正常に動いているのに、Android の WebView で開くとマップのアイコンが表示されない不具合に悩まされていたので、早速導入。

参考にさせていただいたサイトはこちら。

Chromeを使ったAndroid WebViewページのデバッグ|レコチョクのエンジニアブログ
https://techblog.recochoku.jp/2445

 

まず、Chrome でのデバックを行うために、Android の WebView ページに下記の設定を追加します。

WebView.setWebContentsDebuggingEnabled(true);

なお、WebView のページは、多少バグはあるにしろ、既に Web ページが表示できているものとして扱っています。

参考サイトでは、下記のように書かれていましたが、その通りに書いたところ、Android Studio から、その if 文で囲む必要はない!と怒られてしまったので削除しました。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    WebView.setWebContentsDebuggingEnabled(true);
}

アプリへの設定は以上です。
あとは通常通りの手順で、ビルド → 実機で実行します。

アプリが実行出来たら、Google Chrome で chrome://inspect にアクセスします。
すると、下記のような画面が表示されると思うので、デバックしたい端末のモデル名に一致する項目の「inspect」を選択します。

そうすれば、見慣れたデバックツールのウィンドウが表示されるので、それを使ってデバッグを行います。

これで Web ページ部分のエラーのみを確認できるので、かなり便利です。
またこれにより、不具合があるページでどうやら jQuery が読み込めていないのではという疑惑が浮上。
…WebView で表示しているページをブラウザで見てもこんなエラーは発生していないのに!
ということで、引き続きデバック頑張ります。

 

以上、Google Chrome で Android の WebView ページのデバックを行う方法でした。
導入も Android アプリに一行追加するだけなので、とても簡単です。
WebView のデバックでお悩みの方がいましたら、参考にしていただければ幸いです。

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

【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 WebView】webViewに被せたアクションバーに処理を実装する方法

最近になってまたWebViewを触り始めました。webViewってjavascriptとかのイメージが強いですがandroidでも頑張れば実装できるみたい

ですね。しかもこっちはネイティブだから処理速度も安定しているときたので使いこなせれば開発の引き出しが増えそうですね。

今回はそのwebviewを使っていて、アクションバーの中のアイコンをタップしたときに何らかの処理をするメソッドを載せていきます。

 

タップしたアイコンに応じて処理を切り分けるには、onOptionsItemSelected(MenuItem item)メソッドを使う必要があります。

このメソッドは、ヘッダーに当たるアレ。即ちアクションバーに配置したアイコンに応じて処理をswitchで分岐させる役割を

担っています。

例えば、switchの引数idの中身がhomeだった場合は、finish();で終了させてホームボタンにバックさせます。

 

<pre>@Override
public boolean onOptionsItemSelected(MenuItem item) {
    
    int id = item.getItemId();
    WebView webView = (WebView) findViewById(
            R.id.webView);
    switch (id) {
        case android.R.id.home:
            finish();
            break;
        case R.id.menu_share:
            ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(this);

            String url = webView.getUrl();
            
            builder.setText(url);
            builder.setType("text/plain");
            
            builder.startChooser();
            break;
        case R.id.reload:
            webView.clearCache(true);
            webView.reload();
            break;
    }
    return super.onOptionsItemSelected(item);
}</pre>

 

このように、一般的なアプリのアクションバーにあるページ更新やシェア機能も切り分けて実装することができます。

 

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