Androidのアプリ開発関連のブログ

もう一個問題発見した

ロングクリックで背景色を変更してドラッグアンドドロップを開始。
ドラッグアンドドロップ終了で背景色を戻す。

ってところがAPIレベル26にしたら、DragEvent.ACTION_DRAG_ENDEDが発生して無くて背景色が戻らなかった。
ドラッグ側はDragEvent.ACTION_DRAG_ENDEDのみtrueで他はfalseを返してたが、
DragEvent.ACTION_DRAG_STARTEDの時にtrueを返さないとACTION_DRAG_ENDEDが発生しないみたい。

で、ACTION_DRAG_STARTEDをtrueにした場合は続くイベントもtrueを返さないとアプリエラーじゃなくてAndroidのバグぽい感じだが型変換のエラーが出た。

targetSdkVersionを26にしたらandroid:foregroundが・・・

targetSdkVersionを26にして3つ目の問題が生じた。

背景を黒にする必要があるアプリなんだが、layout.xmlで
android:background="#000000"
android:foreground="#FFFFFF"
にしてた。

これで問題なかったのだが、なんか表示されなくなった。
背景が白になって何も表示されない。

android:foregroundをはずしたら解決した。
APIレベル23からなんか変更があった臭い。
android:foregroundを設定すると、子Viewの背景も文字色もそれで描画されちゃうぽい?
foregroundの使い方が間違っていたような・・・

targetSdkVersionを26にしたらストレージアクセスでエラー

対象APIレベルを26にしたら他にも大問題が発生した。

2番目の問題だが、APIレベル23(Android 6.0)から?
要求権限によってはインストール時に取得できず、アプリで取得しないといけないみたい。
外部ストレージの読み書き権限の確認と取得処理を入れる必要があった。

import android.support.v4.content.ContextCompat;
import android.support.v4.app.ActivityCompat;
import android.content.pm.PackageManager;
import android.Manifest;

    if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
    }else{
        //ストレージアクセス
    }
こんな感じで、ストレージアクセスするところで権限を確認して、無ければ要求。

@JavascriptInterface

11月から?
対象APIレベルが26(Android 8.0?)以上のAPKしか公開できなくなるとかで、公開中アプリを
android:targetSdkVersion="26"
を追加してリビルドした。

ビルド環境無くなってたんで再構築してやったのだが、
1個問題の生じるアプリがあってハマった。

WebViewでJavaScriptからJavaメソッドを実行する必要のあるアプリなのだが、うまく行って無い観じで、ログには
I chromium: [INFO:CONSOLE(45)] "Uncaught TypeError: JsObject.ChangeEdit is not a function"
が出てた。
Javaメソッドが定義できてない。

import android.webkit.JavascriptInterface;
して、
JavaScriptから呼び出すJavaメソッドの前に
@JavascriptInterface
アノテーションをつけたら解決した。

シェルを作ろうとしていたが・・・

SSHクライアントの流用で簡単にできると思ったんで、shのターミナルを作ろうとしていたが、
問題があって不完全になっちゃいそうなんで、当面お蔵入りにしておこうかと。


プロンプトの表示は sh に -i オプションつければ表示される。
のだが、-i オプションを付けた場合 sh の起動時に tty の fd が取得できない的な表示が出る。動作はする。
この点が解決方法がわからない。

それと、SSHの場合は何か文字入力したらサーバーの方から表示が返ってくるが、コマンドの結果以外何も帰ってこない。
例えば、
$ ls[Enter]
な感じの時、lsコマンドの結果は返ってくるのだが、lsとEnterは出力されない。
そういうもんなのか?
こっちで勝手にやっちゃおうかとも思ったが、文字単位で送っちゃうと不整合が生じる可能性があるし、
Enterを押した時に送る感じも考えたが、コマンド入力じゃなくて[Y/N]みたいな選択のときもあるし難しい。


というわけで、シェルを作るのは保留にして次は何か別の作ろうかと。
難易度的に難しいと思うのだが、構想はあと2つある。