Call Kotlin method from Flutter(FlutterからKotlinのコード内のメソッドを呼び出す) No ratings yet.

MainActivity.kt (Kotlin)

package (your.app)

import android.content.res.Configuration
import android.os.Bundle
import android.os.PersistableBundle
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

import io.flutter.embedding.android.FlutterFragment
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel

import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result

import io.flutter.plugin.platform.PlatformViewsController


class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)

        MethodChannel(flutterEngine.dartExecutor, CHANNEL).setMethodCallHandler { methodCall, result ->
            val args = methodCall.arguments
            when (methodCall.method) {
                "method1" -> {
                    val number = 10
                    result.success(number)
                }
            }
        }
    }

    companion object {
        private val CHANNEL = "com.your.app.flutter/method1"
    }

}

Dart

static const platform = const MethodChannel('com.your.app.flutter/method1');

Future<void> _Method1() async{
    int _number;
    try {
      final int result = await platform.invokeMethod('method1');
      _number = result;

      setState(() {
        number = _number;
      });

    } on PlatformException catch (e)
    {
      setState(() {
        number = -1;
      });
    }
}

int number;

Widget ShowNumber()
{
  Text(number.toString());
}

_Method1() を呼び出すと Kotlin側のmethod1 -> {} が実行され、結果が Flutter側の result に戻ります。

String testString = “abc”;
platform.invokeMethod(‘method1’, testString); でtestStringを引数にできます。
Kotlin側の methodCall.arguments で引数を取得できます。

io.flutter.app.FlutterActivity の FlutterActivity には FlutterEngine が存在しないのでGeneratedPluginRegistrant.registerWith(this) ではregistできません。またMethodCall の flutterView の代わり(java では getFlutterView() )に flutterEngine.dartExecutor を使用します。


2019-12-05 時点で

import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry

は使用できないようです。公式ドキュメントの方法では動作しなくなりました。

2019-12-05の時点で app/build.gradle 内で Cannot resolve symbol ‘GradleException’ が、MainActivity.kt で Unresolved reference: NonNull がそれぞれ赤字で表示されます。2019-12-07のAndroid Studio アップデートとFlutter Pluginのアップデートで表示されなくなったようです。

こちらのサイトの情報が参考になりました。

https://github.com/flutter/flutter/issues/41102
https://qiita.com/tasogarei/items/bf3761139d46c43d5896
https://qiita.com/unsoluble_sugar/items/ae42b5faf52a491f6470
https://flutter.keicode.com/basics/method-channel-java.php

Please rate this

Google Play Licensing Verification Library (LVL) No ratings yet.

Android Studio 3.5 でGoogle Play Licensing Verification Library (LVL) をインポートする方法です。

  1. File – New – Import Module .. を選択して Source directory: に [ANDROID_SDK]/extras/google/market_licensing/library を指定します。Finishをクリックします。プロジェクト内にlibrary ディレクトリーが作成され、インポートされます。
  2. library/src/main/java/com を android/app/src/main/java/com にコピーします。
  3. AndroidManifest.xmlに次の要素を追加します。
<!-- Devices >= 3 have version of Google Play that supports licensing. -->
<uses-sdk android:minSdkVersion="3" />
<!-- Required permission to check licensing. -->
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />

Please rate this

Unity ‘Object at index 0 is null’ error No ratings yet.

Unityで Object at index 0 is null エラーが発生する。

プロジェクトの Library 、obj 、 Temp フォルダーを削除してプロジェクトを読み込むと発生しなくなります。

Please rate this

Visual Studio 2017用 Microsoft Angel No ratings yet.

Visual Studio 2017用に Microsoft Angel (https://github.com/Microsoft/angle) を修正したものを公開しました。

https://github.com/setokynet/vs2017-winrt-angel_opengl

  • slnファイルの ToolsVersion を14.0から15.0に変更
  • WindowsTargetPlatformMinVersion を10.0.10240.0 から 10.0.10586.0に変更

CoreWindowNativeWindow.cpp を次のように変更しました。

static float GetLogicalDpi()
{
    // ComPtr<ABI::Windows::Graphics::Display::IDisplayPropertiesStatics> displayProperties;
    ComPtr<ABI::Windows::Graphics::Display::IDisplayInformation> displayProperties;

    // if (SUCCEEDED(GetActivationFactory(HStringReference(RuntimeClass_Windows_Graphics_Display_DisplayProperties).Get(), displayProperties.GetAddressOf())))
    if (SUCCEEDED(GetActivationFactory(HStringReference(RuntimeClass_Windows_Graphics_Display_DisplayInformation).Get(), displayProperties.GetAddressOf())))
    {
        float dpi = 96.0f;
        if (SUCCEEDED(displayProperties->get_LogicalDpi(&dpi)))
        {
            return dpi;
        }
    }

    // Return 96 dpi as a default if display properties cannot be obtained.
    return 96.0f;
}

IDisplayPropertiesStaticsとDisplayPropertiesStatics は Windows Phone 8.1 対応が必要となり、Winrt(UWP)では使用できないためIDisplayInformationとDisplayInformationに変更しました。コードの変数はdisplaypropertiesのまま変更していません。

github.com/setokynet/vs2017-winrt-angel_opengl にはCoreWindowNativeWindow.cppは含まれていません。angle-ms-master\src\libANGLE\renderer\d3d\d3d11\winrt\CoreWindowNativeWindow.cpp のGetLogicalDpi()を修正してください。

#include “id/commit.h” が含まれていてコンパイルできない場合、mklink /D /J angle-ms-master\src\id angle-ms-master\src でシンボリックリンクを作成するとコードを修正することなくコンパイルできます。

2018年3月13日現在の内容です。今後の更新で不要になる可能性があります。

Windows Store App でOpenGL(OpenGLES)を使用できます。

Please rate this

Install.Wim, Install.ESD ファイルのマウント No ratings yet.

Windows 10 の install.Wim, install.esd ファイルの展開方法です

DISM を使ってイメージをマウントおよび変更する (https://msdn.microsoft.com/ja-jp/library/hh824814.aspx)

DISM イメージ管理のコマンド ライン オプション (https://msdn.microsoft.com/ja-jp/library/hh825258.aspx)


Wimファイル

[例]C:\win10\install.wim ファイルを C:\win10\Mount にマウント
Wimファイルのインデックスを確認

Dism /Get-WIMInfo /WimFile:c:\win10\install.wim

適用したいエディションのインデックスを確認します。以下1に対して適用するものとします。

  • Dism /Mount-Image /ImageFile:C:\win10\install.wim /index:1 /MountDir:C:\win10\Mount
  • Packageを追加(msu ファイル)
    DISM /image:C:\win10\Mount /Add-Package /PackagePath:(path)\xxx.msu
  • Packageを削除
    Dism /image:C:\win10\Mount /Remove-Package /PackageName:xxx
変更を適用(コミット)
  • Dism /Commit-Image /MountDir:C:\win10\Mount
アンマウント(解除)
  • Dism /Unmount-Image /MountDir:C:\win10\Mount /commit

ESDファイル

[例]C:\win10\install.esd ファイルを C:\win10\Mount にマウント
Esdファイルのインデックスを確認

Dism /Get-WIMInfo /WimFile:c:\win10\install.esd

適用したいエディションのインデックスを確認します。以下1に対して適用するものとします。

  • Dism /Apply-Image /ImageFile:C:\win10\install.esd /index:1 /MountDir:C:\win10\Mount
イメージをキャプチャ
  • Dism /Capture-Image /ImageFile:c:\win10\install.wim /CaptureDir:c:\win10\Mount /Name:"Windows 10"

Packageの追加、削除、コミット、アンマウントは上記Wimファイルと同様です。

WimファイルからEsdファイルを作成
  • Dism /Export-Image /SourceImageFile:c:\win10\install.wim /SourceIndex:1 /DestinationImageFile:c:\win10\install.esd /DestinationName:"Windows 10" /Compress:recovery

Please rate this

パフォーマンスカウンタのエラー No ratings yet.

パフォーマンスカウンタを起動するとエラーが発生します

イベントビュアーで参照したときに、”Windows ログ”に対して次のようなイベントが書き込まれます

  • イベント 3001, LoadPerf
    レジストリのパフォーマンス カウンタ名文字列の値が正しくフォーマットされていません。問題の文字列は n です。この文字列に対するインデックス値は、データ セクションの最初の DWORD に含まれ、最後の有効なインデックス値は、データ セクションの n 番目と n+1 番目の DWORD に含まれています。
  • イベント 3006, Search
    カウンタが読み込まれていないか、共有メモリ オブジェクトを開けなかったため、パフォーマンス モニタを初期化できませんでした。これによって影響されるのは、パフォーマンス モニタのカウンタの使用可能性のみです。コンピュータを再起動してください。
  • イベント 3006, Search
    カウンタが読み込まれていないか、共有メモリ オブジェクトを開けなかったため、Gatherer オブジェクトのパフォーマンス モニタを初期化できませんでした。これによって影響されるのは、パフォーマンス モニタのカウンタの使用可能性のみです。コンピュータを再起動してください。コンテキスト: アプリケーション、 SystemIndex カタログ
  • イベント 10021, Search
    WSearchIdxPi のインスタンス のパフォーマンス カウンタ レジストリを取得できませんでした。次のエラーが発生しました: この操作を正しく終了しました。 0x0。
  • イベント 8317, MSSQL$SQLEXPRESSレジストリ キー ‘HKLM\SYSTEM\CurrentControlSet\Services\MSSQL$SQLEXPRESS\Performance’ に関連付けられている値 ‘First Counter’ をクエリできません。SQL Server パフォーマンス カウンタが無効です。
  • イベント 3009, LoadPerf
    サービス .NETFramework () のパフォーマンス カウンターの文字列をインストールできませんでした。エラー コードがデータ セクションの最初の DWORD に含まれています。
  • イベント 2007, LoadPerf
    .NETFramework サービスのパフォーマンス カウンターを修復できません。LODCTR ツールを使用してパフォーマンス カウンターを手動で再インストールしてください。

イベント 3001, LoadPerf について n は1846の場合が多いようです。

イベント 3009, LoadPerf のサービスについて .NET CLR Data, .NET CLR Networking, .NET Data Provider for Oracle, .NET Data Provider for SqlServer, aspnet_state, Remote Access, UGHTRSVC, usbhub, WSearch, WSearchIdxPi, WSService においても同様のメッセージが書き込まれることがあります。

  • イベント 2001, usbperf
    usbperf\Performance キーの “First Counter” 値を読み取れません。ステータス コードはデータで戻されました。
  • イベント 1008, perflib
    サービス “RemoteAccess” (DLL “C:\Windows\System32\rasctrs.dll”) の Open プロシージャに失敗しました。このサービスのパフォーマンス データは利用できません。データ セクションの最初の 4 バイト (DWORD) に、エラー コードが含まれています。
  • イベント 2001, perflib
    サービス “W3SVC” (DLL “C:\WINDOWS\system32\inetsrv\w3ctrs.dll”) の Open プロシージャに失敗しました。このサービスのパフォーマンス データは利用できません。データ セクションの最初の 4 バイト (DWORD) に、エラー コードが含まれています。
  • イベント 2002, IIS-W3SVC-PerfCounters
    Web サービス カウンターの設定に失敗しました。Web サービス カウンターが正しく登録されていません。

イベント 1008, perflib に関しては、ほかに aspnet_state, ASP.NET_4.0.30319, ASP.NET, .NETFramework も同様のエラーが発生する場合があります。

  • lodctr /R を実行すると エラー 2 が発生します。
  • lodctr /R を実行すると 「パフォーマンス カウンターの設定をシステムのバックアップストアから再構築できませんでした。エラーコードは 5 です。」と表示される。エラー 80078005 が発生します。
  • perfmon /report でエラー:レポートを作成する際に、エラーが発生します。
    アクセスが拒否されました。
  • Windows 8.1 で perfmon /report を実行すると「レポートを作成しようとしてエラーが発生しました。 オペレーターまたは管理者が要求を拒否しました。」 The operator or administrator has refused the request.
    この件については Event 513, CAPI2 の記事を参照してください。

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\(Service name)\Performance に First Counter, First Help, Last Counter, Last Help の値が存在しない、または正しく設定されていない場合に発生します。
  • %SystemRoot%\Inf\.NET CLR Data, WmiApRpl などのフォルダーに iniファイルが含まれていない場合に発生します(特にイベント 3009, LoadPerf)。

修復の手順

1. iniファイルのコピー

対応するサービス(%SystemRoot%\Inf のサブフォルダー名)

  • .NET CLR Data
  • .NET CLR Networking
  • .NET CLR Networking 4.0.0.0
  • .NET Data Provider for Oracle
  • .NET Data Provider for SqlServer
  • .NET Memory Cache 4.0
  • .NETFramework
  • ASP.NET
  • ASP.NET State
  • ASP.NET_2.0.50727 (.ini)
  • ASP.NET_4.0.30319
  • ASP.NET_64_2.0.50727 (.ini)
  • aspnet_state
  • BITS (.ini)
  • ESENT (.ini)
  • MSDTC (.ini)
  • MSDTC Bridge 3.0.0.0
  • MSDTC Bridge 4.0.0.0
  • rdyboost (.ini)
  • RemoteAccess (.ini)
  • ServiceModelEndpoint 3.0.0.0
  • ServiceModelOperation 3.0.0.0
  • ServiceModelService 3.0.0.0
  • SMSvcHost 3.0.0.0
  • SMSvcHost 4.0.0.0
  • TAPISRV (.ini)
  • TermService
  • UGatherer (.ini)
  • UGTHRSVC (.ini)
  • usbhub (.ini)
  • Windows Workflow Foundation 3.0.0.0
  • Windows Workflow Foundation 4.0.0.0
  • WmiApRpl (.ini)
  • wsearchidxpi (.ini)

%SystemRoot%\Inf\(ServiceName) フォルダー内のiniファイルの末尾が _d.ini のファイルは 親フォルダーの ini ファイルを参照しています。ほとんどの場合 サイズが 1KByte 以下です。そしてファイルの日時が異なりますが同じ内容となっています。_d.iniファイルが存在しない場合、0409, 0411等のフォルダーのiniファイルに記述があります。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\(name)\PerformanceキーのPerfInFileにパフォーマンスカウンタに使用する.iniファイル名の記載があります。

インストールディスク、または %SystemRoot%\Winsxs のサブフォルダーから該当するファイルをコピーします。この際、下記の通りインストールしている言語パックに対応するフォルダーのみコピーを行います。コピーを行ったファイルに対してcaclsを利用してアクセス権を設定しなおします。ASP.NET_2.0.50727,  ASP.NET_64_2.0.50727, MSDTC Bridge 3.0.0.0, ServiceModelEndpoint 3.0.0.0, ServiceModelOperation 3.0.0.0, ServiceModelService 3.0.0.0, SMSvcHost 3.0.0.0, Windows Workflow Foundation 3.0.0.0 に存在するファイルに対しては行う必要はありません。

[例]
xcopy %SystemRoot%\WinSxS\amd64_netfx4-_dataperfcounters_ini_b03f5f7f11d50a3a_4.0.15522.0_none_69a84f70710ce8f7\_DataPerfCounters_d.ini %SystemRoot%\Inf\.NET CLR Data

アクセス権を変更します。

cacls (file) /S: "D:PAI(A;;FA;;;S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464)(A;;0x1200a9;;;BA)(A;;0x1200a9;;;SY)(A;;0x1200a9;;;BU)(A;;0x1200a9;;;AC)(A;;0x1200a9;;;S-1-15-2-2)" を実行してアクセス権を修正します。

_none は 0000, _en-us は 0409 or 0009, _ja-jp は 0411 or 0011 の対応となります。

  • 000=Neutral
  • 001=Arabic
  • 005=Czech
  • 006=Danish
  • 007=German
  • 008=Greek
  • 009=English
  • 00A=Spanish
  • 00B=Finnish
  • 00C=French
  • 00D=Hebrew
  • 00E=Hungarian
  • 010=Italian
  • 011=Japanese
  • 012=Korean
  • 013=Dutch
  • 014=Norwegian
  • 015=Polish
  • 019=Russian
  • 01D=Swedish
  • 01F=Turkish
  • 804=Chinese (PRC)
  • 404=Chinese (Taiwan)
  • 416=Portuguese (Brazil)
  • 816=Portuguese (Portugal)

ロケール ID (LCID) の一覧

フォルダーの中に ファイルが存在しない、空のフォルダーが存在すると lodctr /R を実行したときに First Counter, First Help, Last Counter, Last Help の値が正しく設定されず消去されてしまいます。空のフォルダーを削除してから実行してください。使用している言語以外の対応するフォルダーを削除します。

2. First Counter, First Help, Last Counter, Last Helpの追加

regedit.exeを開いて次のレジストリーキーを参照します。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\(name)\Performance を参照します。

(例)

  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UGatherer\Performance
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WmiApRpl\Performance
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbhub\Performance

First Counter, First Help, Last Counter, Last Help (REG_DWORD) を追加します。値は 0 で問題ありません。

lodctr /R を コマンドプロンプトから実行します。「情報: パフォーマンス カウンタの設定をシステムのバックアップ ストアから正常に再構築しました」が表示されます。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\(name)\Performance のFirst Counter, First Help, Last Counter, Last Help の値が正しく設定されているか確認します。

Dism /Online /Cleanup-Image /RestoreHealth を実行します。
sfc /scannow を実行します。


依然としてエラーが発生する場合は パフォーマンスカウンタのエラー(setokynet.wordpress.com) の記事を参照してください。


このエラーによるシステムへの影響

正しく構成されていないと システムが不安定になったり、OSの動作が遅くなったりします。単にパフォーマンスカウンタのエラーだけでなく、Windows Update でシステムファイルが更新されないなどの不具合につながるおそれがあります。

Please rate this

XmlDocument, xmlns No ratings yet.

既定の名前空間として xmlns=””が出力される

XmlDocument _xmldocument = new XmlDocument();
  XmlElement _xmlelement = _xmldocument.Create("root","http://www.setokynet.com/");
  xmldocument.AppendChild(_xmlelement);
  XmlElement _item = _xmldocument.Create("item");
  xmlelement.AppendChild(_item);
  XmlElement _item2 = _xmldocument.Create("item", "http://www.setokynet.com/");
  xmlelement.AppendChild(_item2);
  XmlElement _item3 = _xmldocument.Create("item",_xmldocument.DocumentElement.NamespaceURI);
  _xmlelement.AppendChild(_item3);

<root xmlns="http://www.setokynet.com/">
  <item xmlns="" />
  <item xmlns="http://www.setokynet.com/" />
  <item />
</root>

子要素についてDocumentElementの名前空間を使用する場合、_xmldocument.DocumentElement.NamespaceURI (_xmlelement.NamespaceURI) を指定します。

Please rate this