著者アーカイブ asaba

asaba 著者:asaba

【android】Failed to find configured root that containsの解決法

fileProviderをandroid7.0で動かしたのですがまたもエラーにかかりました。こんなエラーです↓


java.lang.IllegalArgumentException: Failed to find configured root that contains

どうやらパスの指定を間違えていたみたいです。fileProviderを使う時に必ずxmlファイルにpath.xmlを突っ込むのですが、ここでパスの指定先を間違えるとこのようなエラーにハマってしまいます。

このパスでは動かない↓

</pre>
<external-path name="share_images" path="image"/>
<pre>

このパスなら問題なく動く。↓

<external-path name="share_images" path="."/>

どのディレクトリにも行けるように初期位置に配置することがポイントです。また、Environment.getExternalStoragePublicDirectoryを
使っている時に<file-path>を使ってもエラーが出るのでここでは<eternal-path>タグを使いましょう。

asaba 著者:asaba

【Excel】フィルタリングに失敗した時の対処法(自分用)

エクセルファイルを作成している時によく使うフィルタ機能ですが、偶に一番上のデータだけそのままの位置に残ってしまう時があります。

表を作る時にハマりがちなのですが、自分は一番上のデータにカーソルを合わせた状態でフィルタリングすることでさくっと対処できました。フィルタリングしたいデータを全部囲むときにバグが生じるらしいのですが、一つのデータの位置が違うことって意外と気づかないので結構怖いです。

同じような現象に遭遇したら試してみてください。

asaba 著者:asaba

gradleの依存関係を調べる(自分用)

ライブラリの依存関係を調べる方法と言えば./gradlew dependenciesですが、自分のpcではファイルとして認識されなくて少しはまりました。調べてみると簡単に解決したので、また忘れたときのために置いておきます。

とりあえずコマンドを再起動して依存関係を確認したいプロジェクトに移動してgradlew :app:dependenciesと変更して難なく成功。先頭の/.を消去してgradlewとdependenciesの間に「app」を挟むのがポイントです。

なぜ「app」を挟まなないと動いてくれないかは説明できません。自分はドキュメントに直接プロジェクトを保存していますが、それがいけないのでしょうか。

入力方法です↓

cd documents\sampleAppで移動ー>ディレクトリsampleAppに移動したらgradlew :app:dependenciesで入力ー>ライブラリの依存関係がドバっと出てくる。ー>good!

 

asaba 著者:asaba

【androidStudio】レガシーになったGooglePlayServiceライブラリを卒業してみた

もう何年もメンテナンスしていないソースコードでは、大抵はライブラリが昔のバージョンのまま放置されています。古いうえにライブラリに新しいクラスがつっこまれたりしているので新しいAndroidAPIで動かしてみても勿論死にます。自分の担当したアプリも例外でなく、このcompile ‘com.google.android.gms:play-services:8.0.0’というライブラリに手を焼いておりました。

GoogleAPIでも書かれていますが、こいつはもうそのままでは使えません。GooglePlayServiceは大量のクラスを持っているので新規で追加されたライブラリの中で一個でも同じクラスがあった場合は競り合いとみなされ速攻でクラッシュします。厳密には、一つの機能しかないアプリならまあ古いバージョンでも使えますが、それでは実用性がないのでやっぱり使うのにはおすすめしません。

これからはAPI別に機能が分けられたbuild.Gradleを記述することで使えるようになるので、そちらの方法で使いましょう。と公式先生がおっしゃっていたのでそちらに従ってライブラリを入れましょうということです。

例えば、新しいバージョンでもGooglePlayServiceのLocationServices機能が使いたい!と思ったときは既存のGooglePlayServiceを消してこんな感じにgradleに書いていきます。

これを削除

</pre>
compile 'com.google.android.gms:play-services:8.4.0'
<pre>

でこちらを代わりに導入します。

</pre>
<pre>implementation 'com.google.android.gms:play-services-location:16.0.0'</pre>
<pre>

こんな感じで大元のcompile ‘com.google.android.gms:play-services:8.4.0’を削除してアプリの機能にあったライブラリをいれていきます。公式を見ながらでも全然できますが、アプリで使われているライブラリが何なのか先見しておいて調べておくと入れ替えがもっと楽になるのでおすすめです。

公式→https://developers.google.com/android/guides/setup

asaba 著者:asaba

別のプログラムで開いたファイルをさくっと解除する方法

androidアプリ開発時にgradleのいらないファイルを削除したい時にこんなダイアログが出てきました。

別のプログラムがこのフォルダーまたはファイルを開いているので、操作を完了できません。

ここでもきたかアクセス権。と思ったら今回は違うみたい。原因は前に開いていた時のファイルの残滓のようなもので、一回出てくると再起動するまで消えないです。(酷い時は再起動しても削除不可能)

でも再起動はめんどくさいと思ったので直接コントロールパネルからファイル操作の解除をしてしまいます。

まず。システムとセキュリティー>システムー>システムの詳細設定ー>プロパティに入ったらパフォーマンスの中の設定をクリック

アイコンの代わりに縮小版を表示するのチェックボックスを外します。

便利ですが画像がサムネイルで表示されなくなるというデメリットがあります。こちらは削除した後にすぐに元に戻せばちゃんと表示されるので問題なさそうですね。

asaba 著者:asaba

【androidStudio】FileProviderに必要なライブラリのインポート方法

Android7.0でFileProviderを使ってみました。ですがライブラリがないということで早速エラーの壁にぶつかることに・・・。

androidDeveloperや先人方のブログを拝見した結果どうやらFileProviderandroid.support.v4というライブラリに入っており、この中の必要なjarファイルのみを取り出してlibファイルの中に入れる必要があるみたいです。なので‘com.android.support:appcompat-v7:28.0.0’みたいに追記しても中を確認してくれないのでエラーになります。古いアプリだとライブラリとかのバージョンのアップデートで置いていかれているのでアプリのバージョンアップの際には要チェックですね。ライブラリですがこんな感じに追加していきます。

appDataー>localー>androidー>SDKー>extraー>androidー>m2repositoryー>comー>androidー>supportー>suport-compat25.3.1ー>support-compat-25.3.1.aar

下に行くにつれて新しいので、ここでは25.3.1を選択しています。

中に進むとsupport-compat-25.3.1.aarというファイルがありますが、この拡張子をzipに変更します。変更後にzipファイルを開くとclasses.jarというファイルがあるので、これをsupport-compat-25.3.1.jarという名前に変更します。

変更後、jarファイルをコピーしてアプリのlibsファイルに置きます。ディレクトリは、アプリパッケージ名ー>appー>libsです。これを繰り返してFileProviderに必要なファイルを全て置いていきます。

ファイル操作はこれで完了です。後はandroidStudioで先ほど追加したライブラリ群をインポートしていきます。メニューのproject structureを開きmodulesのappを開きます。右端のdependenciesをクリックします。

同じく右端のプラスのボタン(緑色)をクリックしてjar dependenciesをクリックすると、先ほど追加したライブラリが表示されるのでこれをひたすら追加していきます。すると、グレイドルにこんな感じで追加されていると思います。

最後に下の一文を追加します。fileProviderに必要なライブラリのインポートはこれで終了です。

</pre>
<pre>compile fileTree(include: ['*.jar'], dir: 'libs')</pre>
<pre>

かなり手間がかかりますが、gradleのアップデートを忘れていなければ大丈夫そうかな?と思います。

asaba 著者:asaba

【android】Android7.0でのUri取得方法について

復活したエミュレータでビルドをしたのですが、今度はFileUriExposedExceptionというエラーで詰みました。リファレンス曰く、Android7.0以降は、フレームワークによりfile:// URI の公開を禁止する StrictMode API ポリシーが適用されます。なのでAndroid7.0を対象にfile://と名の付くurlをインテントすると、このFileUriExposedExceptionを引き起こすみたいですね。自分のエミュレータも23以降は動いたのにApi24からカメラを起動しようとして落ちたので、恐らくuriを変換してfile://を受け取ろうとしたときにこれに引っかかったのだと思われます。なのでアプリ間でファイルを共有するには、content://URI を送信して、この URI への一時的なアクセス パーミッションを付与する必要があります。変換の仕方ですが、Android7.0以前では外部ファイルからuriを取得するときはUri.fromFileを使っていましたね。バージョンによって処理を場合は分岐させたい場合は、if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {}で分けておきましょう。

API24以前

imageUri = Uri.fromFile(picFile);

API24以降

Uri uri = FileProvider.getUriForFile(
getActivity(),
BuildConfig.APPLICATION_ID + ".fileprovider",
picFile);

マニフェストにも以下のタグを追加していきます。

<provider
    android:name="com.android.tools.ir.server.InstantRunContentProvider"
    android:authorities="パッケージ名"
    android:multiprocess="true" />
※authoritiesは、マニフェストの先頭部分にあるpackage=""から参照します。

レイアウトファイルにもBuildConfig.APPLICATION_IDがパスを取得できるようにパスを書いておきましょう。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path android:name="external_files" android:path="." />
</paths>

以上がcontent://ファイルを取得する方法です。これからアプリを一から作る分にはさほど苦労しないかもしれないですが、前からあるプログラム相手だと既存の仕様と睨めっこしなければいけないのでここで骨が折れます。

asaba 著者:asaba

【androidStudio】HAXMが消失してエミュレータが動かない時の解決法

APIレベルが28のエミュレータをインストールして動かそうとしたらエラーが発生。28だけじゃなく他のインストール済みだったエミュレータも全部使えなくなったのでとりあえずSDK周りをチェックしてみました。

No accelerator found。アクセラレータ・・・つまりHAXMがないということ?ちなみにHAXMとはエミュレータの動作を早くするための仮想エンジンの略称で、フルネームはHardware Accelerated Execution Manager となっています。これがないとエミュレータの処理がめたくそ遅くなります。ほとんどの開発プラットフォームではインストールされているか推奨のはずです。

調べたところ、このHAXM Installerがインストールされていないなかったのでこれをインストールして再起動してみました。が動かない・・・。インストール方法は、androidStudioからツールー>アンドロイドー>SDKマネージャーー>androidSDKの中のSDKToolでダウンロードすることができます。また再インストールかと思ってよく見てみると、インストールできたのはHAXM Installer(ハコもの)だけでHAXM自体はダウンロードされていなかったことが分かりました。

そこで次はHAXMのインストールをしていきます。インストール方法は、intelhaxm-android.exeをクリックするだけです。ディレクトリは、ユーザーー>ユーザー名ー>appDataー>Localー>androidー>SDKー>extrasー>intelと辿っていけばHardware_Accelerated_Execution_Managerファイルにたどり着くので、その中にあるintelhaxm-android.exeをクリックしましょう。するとインストールダイアログが表示されるのでインフォメーションに従って進めていけばダウンロードできます。すでにHAXMがあるという方は、removeでいったんHAXMをアンインストールして再度インストールしましょう。途中で警告がでますが、進んで削除していっても構いません。無事に終了すれば下記のようなダイアログが表示されます。この後androidStudioを再起動してエミュレータを起動して一番上のエラーが出なければ解決となります。

以上です。しかし、なぜエミュレータを追加しただけでHAXMが消失したのかは分かりませんでした。一つ感じたのは、HAXMありであの遅さはきついものがあります。ということです。

asaba 著者:asaba

【android】外部ストレージからディレクトリを取得する方法

今回は完全に自分用の記事になっております。内容は、カメラで撮影した写真のディレクトリを取得する方法についてです。撮影した画像は、大体は外部ストレージ(SDカードのような)に保管されます。他のアプリを消しても写真を残しておきたいという時は、外部ストレージから取り出してやりとりしてあげればいいのです。今回は、外部ストレージにアクセスしてパブリックなファイルに新しいファイルを作ってくれる方法を書き残しておきたいと思います。(くどいようですが今回は完全に自分用なのでご容赦ください)

通常androidのような端末は、通常撮影した画像はDCIMというファイルに保存されます。DCIMとは、android本体に内蔵されているファイルのことで、アプリのカメラで撮影した画像を除く画像は、全てこのファイルに収納されます。このDCIMに保存されていれば、SDカードさえあればどのデバイスでも画像を共有して使うことが出来ます。このDCIMから続くディレクトリを取得するにはgetExternalStoragePublicDirectoryという関数を使う方法があります。この関数を使えば、パブリックなディレクトリ(自分のandroid付属のカメラで撮影した画像がある場所)をピンポイントで取得してくれるのです。urlを取得して加工したい時とか便利そうですね。

<pre>File imageStorageDir = new File(
  Environment
  .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),
  "VG"
);</pre>
<pre>picFile = new File(imageStorageDir + File.separator + "IMG_"
  + String.valueOf(System.currentTimeMillis()) + ".jpg");</pre>

System.out.printlnで出力したものがこちら


I/System.out: /storage/emulated/0/DCIM/VG/IMG_1551774023376.jpg

new fileの引数にDCIMに続くVGファイル、更に先のIMG、数値の入ったipgが連結されて出力されているのがわかると思います。

今ではもう古い技術ですが、覚えておくとディレクトリ取得のモデルというか応用で役に立つので損はないかと思っております。

asaba 著者:asaba

【javascript】消したはずのプラグインが残った時の対処法

少し前い、新しいバージョンでインストールしたはずのプラグインがconfig.xmlから取得できないという場面がありました。

plugin lsでプラグインが存在するのにも関わらずこのようなエラーに遭遇するということは、恐らくpackage.josnに記憶できていないためと思われます。一度前に同じプラグインを入れてrmで消していると、前の同じプラグインのデータが重複して取ってこれなくなるのが原因かと考えられます。プラグインを入れる前に、前の同じプラグインが消えているかどうか確認をしてから入れてみてください。それでもダメならコマンドやソースツリーでプラグインを入れた履歴を削除してみてください。