2024年04月17日

UbuntuにSSHで接続してコマンド実行するAndroidアプリを作る

リモート動作のUbuntu(22.03で確認)をAndroid端末から自作アプリでSSH操作したい場合、JSchを使うと可能だった。

==== JSch ライブラリ使用の準備 =====
1)jsch ダウンロード
http://www.jcraft.com/jsch/
ここではjar ファイルを指定する jsch-0.1.55.jar(280,681 bytes) とする

2)Androidのプロジェクトに追加
/app/lib ホルダを作成してその中にダウンロードしたjsch-0.1.55.jar を追加

3)AndroidStudioにライブラリ追加したことの設定
GradleScripts の中の buiild.gradle1(Module:app) の dependencies 範囲内で以下行を追加
 implementation fileTree(include: ['*.jar'], dir: 'libs')

===== 作成コード例 =====
以下、Copilot が吐いたコード例にすこし加筆。優秀ですな。
import com.jcraft.jsch.*;

public void
sshcommand(String commandArgs, String Host, String User, String Pass )
{
try {
JSch jsch = new JSch();
Session session = jsch.getSession(username, host, 22);
session.setPassword( password );
session.setConfig("StrictHostKeyChecking", "no");
session.connect();

// Execute the shutdown command
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand( commandArgs );
channel.connect();

// Wait for the command to complete
while (!channel.isClosed()) {
Thread.sleep(1000);
}
channel.disconnect();
session.disconnect();
} catch (JSchException | InterruptedException e) {
e.printStackTrace();
}
}
で、何かボタンとか押されたら上記の sshcommand を実行するようにする。
実行したいコマンドをcommandArgsへセット。
ホストはIPアドレス、User/Pass はUbuntuのログイン用をセット。

ただし、ShutdownとかRebootとかの管理者権限が必要な場合はsudo付けるだけでは行かないので、Ubuntu側でuser下の適当なホルダで
#!/bin/bash
PASSWORD='(パスワード)'
echo $PASSWORD | sudo -S shutdown -h now
という内容の名称適当でファイルを作り、実行権限を与えたうえで、このファイルを指定する。

余談:コマンドのレスポンスを受けたいときは 
「JSchライブラリにおいて、channel でsetcommand したあとのレスポンスを取得するサンプル」
とCopilotさんに問うと答えてくれた。


----
動作確認
androidStudio2023
Ubuntu22.03が走るCPUボード
で行った。

※ Ubuntu側にはSSHが入っていること。
sudo systemctl status ssh
でUnit ssh.service could not be found.と表示の場合は
sudo apt install openssh-server -y
でインストールできる。



posted by すら at 13:10| Android

2024年03月12日

AndroidStudio 2023.2.1 の日本語化

AndroidStudioのダウンロード
https://developer.android.com/studio?hl=ja

AndroidStudioの日本語化
Android Studioをまずインストールして起動する
最初の画面の左下の歯車クリック→Aboutクリックしてバージョン情報を表示
Build #AI-に続く3桁数値をメモ。
例:Android Studio Iguana | 2023.2.1 の場合は#AI-232
JetBrainsのサイトにアクセス。
https://plugins.jetbrains.com/plugin/13964-japanese-language-pack------/versions/stable
AIに続く3桁を持ち、小数点以下が最大のものを探してダウンロード
例:232.307 など
インストール手順が出る→基本的にはその通りに。
AndroidStudioの上でCtrl+Alt+Sを押してIDE Setting画面を出す
やや上右の方にある歯車マークをクリック、Install Plugin from Diskをクリック
Choose Plugin FileでダウンロードしたZipファイル(ja.232.307.zipなど)を選択してOK
AndroidStudioの画面右にJapaneseLanguagePackと出るのでRestartIDEをクリック

※IDEをバージョンアップする際には、japanese-language-packを一旦アンインストールし、バージョンアップしたAndoridStrudioに合致した日本語パックをダウンロードし入れる必要があるそうです。


posted by すら at 12:33| Android

2021年09月20日

以前作ったGPSのアプリが正常動作しない!

以前作成した、GPSのNMEA電文を使ったAndroidアプリが新しいタブレットでは正常動作しなくなった。

デバッガでブレークポイントを仕掛けてみると。
NMEA電文を取得するのに使っていたGpsStatus.NmeaListenerというリスナーに制御が回ってこない。
調べたところ。
https://developer.android.com/reference/android/location/GpsStatus.NmeaListener
API Level24で非推奨になってるじゃないか。
代替はonNmeaMessageというリスナーになってて、要はGNSS(みちびきとか)の対応みたいだ。※API Level24=Android7.0な模様。

onNmeaReceived(long timestamp, String nmea)


onNmeaMessage(String message, long timestamp)

地味にメッセージとタイムスタンプが入れ替わってるのがなんとも・・・。

----
具体的なめも
1)app/build.gradleのターゲットバージョンとかそこら辺を整合。
 (これが一番厄介か?)
  ProjectStructureで
   Propertiesの CompileSdkVersion、BuiildToolsVersion
   Flavorsの MinSdkVersion、TargetSdkVersion
  あたりを修正しておく。

2)import android.location.GpsStatus; -> 
import android.location.OnNmeaMessageListener; に変更

3)public class MainActivity extends Activity implementsの後ろの
GpsStatus.NmeaListener -> OnNmeaMessageListener に変更
※これはコードの書き方にもよる。

4)public void onNmeaReceived(long timestamp, String nmea)を
public void onNmeaMessage( String nmea, long timestamp)に変更
(もちろん@Overrideは要る)
※これもコードの書き方にもよる。
※この書き方だとLocationManagerのaddNmeaListener()辺りは変更が要らなそう。

とまあこんな感じで動いた。


posted by すら at 09:26| Android

2020年08月10日

Android端末からソフトウエアの取り出し

Androidのソフトウエア=apkファイル。
これを取り出すソフトウエアとして、 Apk Extractor をインストールした。
Apk Extractorをインストールして実行するとアプリ一覧が出るので、目的のアプリをタップ、Extractするかのメッセージが出るのでCONFIRMをタップ。
するとアプリ指定のホルダに保存される。
注意点としてアプリ指定のホルダ自体はPCから繋いでも見れるが、ホルダの中身は見れない(セキュリティの都合?)。
Androidからは見れるので、FileCommander等でアプリ指定ホルダからDownload等へapkファイルをコピー/移動する。
 
なお、この手順で取り出したapkファイルはインストールできない場合もある。
出来なければさっくりと諦める事。

posted by すら at 13:05| Android

2020年07月12日

SONY XPeria Tablet Z2 の代替としての HUAWEI MediaPad M3 Lite10

XPeria Tablet にそのまま置き換わるタブレットはあまりない。
なかなか防水までしてくれないなど、

そのなかで、解像度だったり防水だったりで代替になりそうなのはMediaPadだったりする。
しかしXPeria Tablet Z2 向けに作ったアプリ(特に画面の位置を絶対的なpxで指定した場合)、そのままMediaPadM3で表示すると、全部を表示しきれない。
そんな場合、開発者向けオプションの中の描画メニュー内にある、最小幅を変えると表示できるようになる。
私のMediaPadのデフォルト値は566
764にすると、アプリの画面を全部表示できた。

なお、数値はシステムに都合の良い値に丸められる上に、数値によっては左側の設定メニューの内容が消える。
色々変えてみて、左側のメニューを表示する値とすること。
764、767、770、791あたりが使えた。

表示しないまま設定を終了するとその後、設定画面の左側のメニューを表示できない。スクロールバーだけ出てきたり。
色々電源切ってみたりとか再起動、縦横回転とか、触ってるとなんとなく横画面ならアイコンだけ出てきたりするのでその時に値を直す。


なので触る時は心準備が必要です(^^;



posted by すら at 16:02| Android

2019年10月02日

サイズ指定色々

位置の指定などで使うもの
px:ピクセル
dp(dip):密度非依存ピクセル

dpは画面を360×640として扱うというもの(縦の場合)。
pxは単純にハードウエア的画素数。

よって
mdpi(360*640)は1dpは1px(これが基準)
xxhdpi(1080*1920)なら 1dpは3px
xxxhdpi(1440*2560)なら 1dpは4px

dpi:1インチ中のピクセル数
mdpiでは160dpi→逆算すると、画面サイズは4インチ(102mm)×2.25インチ(57mm)
ということでスマホ用です。


-----
フォントサイズで使うもの
sp:スケール依存ピクセル
システムのフォントサイズ指定がNormalの時に、dpと同等となる。
small指定で15%小さい、Large指定で15%大きい様子。

-----
タブレットではdp解像度ではほとんどの機種でおおよそ以下の範囲におさまるとのこと。
・短辺が600〜800dp
・長辺が960〜1280dp


-----
結局は
DisplayMetrics metrics = new DisplayMetrics();
 getWindowManager().getDefaultDisplay().getMetrics(metrics);
なんてことをして実機でdp調べるのが早いということみたいだ。
参考:
https://developer.android.com/reference/android/util/DisplayMetrics.html

若しくはGooglePlayから Screen Size / Info / Dpi なるアプリを落とすか?

続きを読む
posted by すら at 12:57| Android

2019年08月16日

作成したアプリのアイコン変更

app/src/main の AndroidManifest.xmlに
android:icon="@drawable/icon"

などと場所が記載されいているので、そこのアイコンファイルを変更する。

例えば上記ならば、app/src/main/res/drawableの下に、icon.なんちゃらのファイルがある。

posted by すら at 14:59| Android

2018年09月10日

Androidアプリケーションのバージョン

build.gradle のなかで
defaultConfig の
versionCode、versionName を更新する。
posted by すら at 13:00| Android

2018年04月28日

マニフェスト has incorrect root tag

開発PCを替えたら、既存プロジェクトの実行時に「androidmanifest.xml does not exist or has incorrect root tag」というエラーが出る場合の対処について。
それ以外にも、xmlファイルでタグが見つからないエラーが発生しまくる時とか。

以下、Android Studio 0.8.6の場合。

tool -> Android -> Sync Project with Gradle Files
Build -> Make Procjet

を2度ほど順に実行してみると直る。
posted by すら at 11:08| Android

2017年05月30日

apkファイル名の変更

※Gradleが古いもの用

Gradleが古いとvariant.outputs.eachでエラーが出るので、よく書かれている奴ではできなかったりする。


appホルダ内のbuild.gradleについて。
android {}の最後の方に以下を追加。


    applicationVariants.all { variant ->
//        if (variant.buildType.name.equals("release")) {
        if (variant.buildType.name.equals("debug")) {
            def file = variant.outputFile
            def applicationId = defaultConfig.applicationId
//            def versionCode = defaultConfig.versionCode
            def versionName = defaultConfig.versionName
//            def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
//            def newName = "${applicationId}_r${versionCode}_v${versionName}_${date}.apk"
            def newName = "${applicationId}_ver${versionName}.apk"
            variant.outputFile = new File(file.parent, newName)
        }
    }

releaseをdebugにすれば、デバッグ用apkファイルも名前が変わる。
GooglePlayで配布でなければこれでいいかも。
posted by すら at 12:30| Android

2016年06月08日

Androidパッケージ名変更・表示名変更


[パッケージ名変更]
Androidの同一ソフト識別はパッケージ名で行う。
変更すれば一つの機器に複数インストールできる。

AndroidSudioにおいて
app/src の下の build.gradle の以下パッケージ名部分を変更
android {
    ....
    defaultConfig {
        ....
        applicationId パッケージ名
        ....
    }
    ....
}
その後、画面右上のSyncNow をクリックして反映する。


[表示名変更]
app/src/main/res の下の、 AndroidManifest.xml において
以下アプリ表示名の部分が表示される

<application>
    ....
    android:label=アプリ表示名
    ....
    <activity>
        ....
        android:label=アプリ表示名
        ....
    </activity>
</application>

ただし、変更するのは app/src/main/res/values の下の
strings.xml において
<resources>
    <string name="app_name">アプリ表示名</string>
    ....
</resources>
の部分を変更する。
posted by すら at 10:26| Android

2016年05月19日

XMLだけを編集してエラーが出るようになった場合。

AndroidStudioで以下のエラーが出た場合。


Error:Execution failed for task ':app:mergeDebugResources'.

> java.lang.NullPointerException (no error message)



プロジェクトのリビルドをするとなおる。
posted by すら at 11:32| Android

2016年04月06日

Android Studio の旧バージョン取得

Android Studio は最新しかGoogleでダウンロードできない模様。

が、以下サイトでダウンロードできる。

http://tools.android.com/download/studio


Gradleのバージョン違いのエラーうざい。
posted by すら at 11:19| Android