将棋プログラミング

(将棋に関する)ソフトウェア開発のノウハウ等。

Android Studio の警告を表示しない

Android Studio を Electric Eel に更新したところ、表示される警告が多くなった。

Commented out code

特に、2行以上のコメントに対して、weak warnings が次のように表示されるので、これを表示しないようにした。

コメントの weak warnings

File - Settings のメニューを実行し、Editor - Inspections で、Java - Code maturity - Commented out code のチェックを外す。

Inspections

これで、コメントに対する weak warnings が表示されなくなった。

インテント

インテントに対して、次の警告が表示される場合がある。

The indentation string here is different ...
インテントの警告

この場合、More actions を実行し、次の Suppress SuspiciousIdentation ... を実行すると、警告しなくなる。

More actions

statement has empty body

次の警告を消したかったが、どこにあるかわからなかった。

'if' statement has empty body
'else' statement has empty body

has empty body で検索し、Probable bugs の Statement with empty body だとわかった。

Statement with empty body

Android SDK Platform-Tools の更新失敗

Android StudioAndroid SDK Platform-Tools を更新しようとして失敗した。
次がログの一部である。

"Install Android SDK Platform-Tools (revision: 33.0.3)" failed.
Failed to complete operation using com.android.tools.idea.sdk.install.patch.FullInstaller, 
retrying with com.android.repository.impl.installer.BasicInstaller

Android Studio を管理者権限で起動し、再度、更新しようとして失敗した。
次がログである。

Preparing "Install Android SDK Platform-Tools (revision: 33.0.3)".
Downloading https://dl.google.com/android/repository/platform-tools_r33.0.3-windows.zip
Patch invocation failed! 
"Install Android SDK Platform-Tools (revision: 33.0.3)" failed.
Preparing "Install Android SDK Platform-Tools (revision: 33.0.3)".
Downloading https://dl.google.com/android/repository/platform-tools_r33.0.3-windows.zip
"Install Android SDK Platform-Tools (revision: 33.0.3)" ready.
Stopping ADB...
Installing Android SDK Platform-Tools in C:\Users\(ユーザ名)\AppData\Local\Android\Sdk\platform-tools
An error occurred during installation: 
Failed to deleteC:\Users\(ユーザ名)\AppData\Local\Android\Sdk\platform-tools.
"Install Android SDK Platform-Tools (revision: 33.0.3)" complete.
"Install Android SDK Platform-Tools (revision: 33.0.3)" failed.
Failed packages:
- Android SDK Platform-Tools (platform-tools)

次のように、フォルダの削除に失敗している。

Failed to deleteC:\Users\(ユーザ名)\AppData\Local\Android\Sdk\platform-tools.

Android Studio を終了し、このフォルダを手動で削除し、再度、更新したところ、更新に成功した。

Android Studio で日付けを入力する

開発中に、日付けの入ったコメントの入力はよく行うので、日付けの入力は自動化したい。
通常、マクロを使うが、開発ツールによって方法が異なる。

Android Studio の場合は、Live Templates を使うしかないようだ。
File - Settings のメニューを実行し、Editor の Live Templates を選択する。
画面右の + をクリックし、 Live Template を実行する。

Live Template を作成

Abbreviation (略語)を例えば Date とし、Description に Inserts Date を入力する。
Template text に、次を入力する。

// $date$

$date$ は、ライブテンプレート変数である。

pleiades.io

Edit variables をクリックし、Expression に次を入力する。

date("Y/MM/d")

date() は、日付けを返す関数で、時刻を付けることもできる。

ライブテンプレート変数

Applicable in ... の Change をクリックし、例えば、Java の Comment と Statement をチェックする。
Gradle でも使うためには、Groovy をチェックする。

Applicable in ...

コードの入力中に Ctrl + J を入力すると、次のように、Live Templates が表示される。
"Da" を入力しても Date が候補として、表示される。

Date が候補として、表示される。

Date をダブルクリックすると、次のように、日付けが入力される。

日付けが入力される。

なお、現在、特定の Live Template をショートカットキーに割り当てることはできないようだ。

iOS の Objective-C で UTType を使う

iOSObjective-C で、例えば、次のように UTType を使う場合、

NSArray *theTypes = [UTType typesWithTag: @"extension" 
tagClass: UTTagClassFilenameExtension conformingToType: nil];

次の import が必要だった。

#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>

リンク時、次のエラーになった。

Undefined symbol: _OBJC_CLASS_$_UTType

UniformTypeIdentifiers.framework をリンクし、解決した。
なお、Optional でリンクしないと、古い iOS でクラッシュする。

参考:
qiita.com

Android 12 対応

アプリをアップデートしようとしたところ、次のエラーが表示された。

現在、お客様のアプリは API レベル 30 を対象にしています。セキュリティとパフォーマンスが最適化された最新の API を利用するには、API レベル 31 以上を対象にする必要があります。アプリの対象 API レベルを 31 以上に変更してください。

2022年11月より、アプリのアップデートは API レベル 31 以降を対象としないといけなくなっていた。

developer.android.com

まず、単純に、build.gradle の compileSdkVersion と targetSdkVersion を 31に上げた。

android {
    compileSdkVersion 31

   defaultConfig {
       targetSdkVersion 31
    }
}   

再度、アップデートしようとしたところ、次のエラーが表示された。

アップロードされた APK または Android App Bundle には、インテント フィルタを使用するアクティビティ、アクティビティ エイリアス、サービス、またはブロードキャスト レシーバが含まれていますが、'android:exported' プロパティ セットは使用されていません。
このファイルは Android 12 以降にはインストールできません。

Android 12 では、Manifest で、インテント フィルタを使用する activity や receiver, service 等にAndroid:exported="false | true" の記述が必要になった。

<activity android:name="name_of_the_activity>"
    android:exported="false | true"
    tools:node="merge" />

<receiver
    android:name="name_of_the_entry"
    android:exported="false | true"
    tools:node="merge" />

起動する activity 等、他から使用される場合は、 exported="true" にしないといけない。
サービスがアプリの内部でのみ使用され、exported="true" にしていると、次の警告が表示される。

Exported service does not require permission.

この場合、exported="false" にすると、警告は消える。

ビルド時、次のエラーが表示された。

Invoke-customs are only supported starting with Android O (--min-api 26)

この場合、build.gradle に次を追加することで、エラーは消えた。

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Android 12 で、使用している SDK 内で、次の Crash が起きた。

java.lang.IllegalArgumentException: 
Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.

SDK を最新版にすることで、この問題は解決した。

iOS - UITableView の detailTextLabel を更新

UITableView の表示を更新するためには、通常、次のコードを実行する(UITableViewController の場合)。

    [self.tableView reloadData];

以前は問題なかったが、 Xcode 13 で作成し、iOS 15 で実行すると、なぜか、このコードを実行しても detailTextLabel が更新されない(テーブルの表示が更新されない)、という現象が起きた。
原因不明なので、やむを得ず、次の方法を使い、更新することができた。

    // 特定のセルを更新する
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow: * inSection: *]];
    cell.detailTextLabel.text = (文字);

Visual Studio 2013 で、オンライン サービスは使用できません。

Visual Studio 2013 を使用中に、次の画面が表示された。

Visual Studio にサインイン

いつもは、サインインすればいいが、今回は、サインインを実行しようとすると、

オンライン サービスは使用できません。後でやり直してください。

と表示され、サインインできない。

オンライン サービスは使用できません

プロダクトキーを使用してライセンスを取得します、を実行して、一応、Visual Studio 2013 を使用できるようになった。