FileProvider.GetUriForFileでNullPointerExceptionが発生する

デバック時にNullPointerExceptionが発生しマニフェストファイルでミスがあったので覚え書きです。

        private void CameraIntent()
        {
            Log.Info(TAG, "CameraIntent::start");
            File cameraFolder = new File(Android.OS.Environment.GetExternalStoragePublicDirectory(
                Android.OS.Environment.DirectoryDcim), "Camera");

            // file name
            string filename = new SimpleDateFormat("ssHHmmss", Locale.Us)
                .Format(new Date());
            m_filePath = String.Format("{0}{1}.jpg", cameraFolder.Path, filename);
            Log.Debug(TAG, "filename:: {0}", m_filePath);
            Log.Debug(TAG, this.PackageName);
            try
            {
                m_uri = FileProvider.GetUriForFile(this,
                    this.PackageName + ".provider",
                    new File(m_filePath));

            } 
            catch(Exception e)
            {
                Log.Error(TAG, e.ToString());
            }
            Intent intent = new Intent(MediaStore.ActionImageCapture);
            intent.PutExtra(MediaStore.ExtraOutput, m_uri);
            StartActivityForResult(intent, RESULT_CAMERA);

            Log.Debug(TAG, "CameraIntent::end");
        }
  • AndroidManifest
  <provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="${applicationId}.provider"
      android:exported="false"
      android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
  </provider>
  • log
07-30 00:00:58.011 D/Phptp2Text::MainActivity(23022): filename:: /storage/emulated/0/DCIM/Camera58000058.jpg
07-30 00:00:58.012 D/Phptp2Text::MainActivity(23022): Photo2Text.Photo2Text
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022): Java.Lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <f32579baafc1404fa37ba3ec1abdc0bd>:0 
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at Java.Interop.JniEnvironment+StaticMethods.CallStaticObjectMethod (Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00069] in <09bf3e262b934ffab2ba01f9fc7fd54d>:0 
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at Java.Interop.JniPeerMembers+JniStaticMethods.InvokeObjectMethod (System.String encodedMember, Java.Interop.JniArgumentValue* parameters) [0x00018] in <09bf3e262b934ffab2ba01f9fc7fd54d>:0 
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at Android.Support.V4.Content.FileProvider.GetUriForFile (Android.Content.Context context, System.String authority, Java.IO.File file) [0x00070] in <fb0c55a748614587b658fc2ca38fdfc2>:0 
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at Photo2Text.MainActivity.CameraIntent () [0x00088] in G:\repo\photo2text\Photo2Text\MainActivity.cs:73 
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   --- End of managed Java.Lang.NullPointerException stack trace ---
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022): java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:591)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:565)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:403)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:30)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at android.view.View.performClick(View.java:5204)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at android.view.View$PerformClick.run(View.java:21153)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at android.os.Handler.handleCallback(Handler.java:739)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at android.os.Handler.dispatchMessage(Handler.java:95)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at android.os.Looper.loop(Looper.java:148)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at android.app.ActivityThread.main(ActivityThread.java:5417)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at java.lang.reflect.Method.invoke(Native Method)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
07-30 00:00:58.077 E/Phptp2Text::MainActivity(23022):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

原因

AndroidManifestに原因があった
providerがapplicationタグのそとに書かれていたので参照できずヌルぽが発生していたようだ。 書き直したAndroidManifestはこちらです。

  <application
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
      <meta-data
          android:name="android.support.FILE_PROVIDER_PATHS"
          android:resource="@xml/provider_paths"/>
    </provider>
  </application>

単純なミスほど原因が分からず困りますね

windows - linux 間のファイル共有

smb環境構築

windows - linux 間でファイルのやり取りを行うためにsmbを使う

  • まずはsambaのインストールを行う
sudo apt install samba
  • smbの起動
sudo service smbd start
  • ユーザーとパスワードの設定
sudo smbpasswd -a USERNAME  
  • 共有するフォルダの設定
[share]
path = 共有するフォルダpath
public = yes
writable = yes
printable = no
  • smbのリスタート
sudo service smbd restart

axmlでintellisenseが有効にならない

axmlでintellisenseが有効にならなかったので有効になるようにする方法

基本的にこちら
Android .axml ファイルでは、Intellisense を有効にする方法は? - Xamarin | Microsoft Docs

ただ
android-layout-xml.xsd
schemas.android.com.apk.res.android.xsd
が見つからなかったのでGithubから

GitHub - atsushieno/monodroid-schema-gen: IT IS A DEAD PROJECT, obsoleted by https://github.com/atsushieno/xamarin-android-shema-generator

android-layout-xml.xsd、schemas.android.com.apk.res.android.xsdを以下のフォルダに保存
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Xml\Schemas

xml -> shcemaから先ほど追加したファイルを有効にする
f:id:mo121_7:20180502211750p:plain

そうするとintellisenseが有効になります f:id:mo121_7:20180502211019p:plain

CS1056 Unexpected character '[]' を回避する

ASP.NET core でプロジェクトを作成し、Buildした際CS1056 が発生した
f:id:mo121_7:20180423213946p:plain

C:\Users\ユーザー名\AppData\Local\Tempのフォルダーに.NETCoreApp,Version=v2.0.AssemblyAttributes.csが 作成されているのでこれを削除し、ReBuildを行うとエラーができなくなった

IntelliJでjarを作成

Intellijでjarを作る方法がわからなかったので調べました

今回ビルドしたのはこれです!

contrib-drivers/bmx280 at master · androidthings/contrib-drivers · GitHub

File -> Project Structure f:id:mo121_7:20171203021435p:plain

Artifacts -> Add -> JAR -> From modules with dependencies
f:id:mo121_7:20171203021435p:plain

f:id:mo121_7:20171203021544p:plain

Build -> Build Artifacts
f:id:mo121_7:20171203021812p:plain

f:id:mo121_7:20171203021842p:plain

これでビルドができます

Ubuntu環境構築

Ubuntu16.04でangularの環境構築をしました

基本的には

npm install -g @angular/cli

のみでOKです。

ただし、nodejsのバージョンが古い場合はインスールでこけてしまうようです。

nodejsのアップデートを行えば正常にインスールが完了します。

nodejsのアップデート方法は

npm install -g n
n stable

で最新のnodejsがインスールできます。