20201006のAndroidに関する記事は5件です。

【Kotlin】委譲プロパティ (Delegated Properties) 入門

【Kotlin】委譲プロパティ (Delegated Properties)について

目次

  1. 委譲プロパティ (Delegated Properties)とは
  2. 委譲とは
  3. 標準ライブラリ
  4. まとめ
  5. 参考にさせていただいたサイトなど

委譲プロパティ (Delegated Properties)とは

  • クラスのプロパティ(メンバ)のsetter/getter処理を別のオブジェクトに移譲する仕組み
    • ここで私は、移譲とはというのがまだ理解できてないレベルでした。
  • byを使うことで、委譲する先を指定できます。

委譲とは

  • 委譲 (delegation) とはオブジェクト指向プログラミングにおいて、あるオブジェクトの操作を一部他のオブジェクトに代替させる手法のこと。 (wikipedia参照)

    • クラスBで処理を、クラスAのオブジェクトに委譲している。
Sample.kt
class A {
  fun foo {
    println("hoge")
  }
}

class B {
  // クラスBは、hogeの処理をクラスAに委譲している。
  fun hoge {
     val a = A()
     a.foo()
  }
}

標準ライブラリ

delegated propertiesの標準ライブラリとしては、lazyとObservableなどがあります。
その他、NotNullなどがありますが、こちらはまだよく分かってないです。

lazy

lazyは、プロパティの初期化を初めて参照された時まで遅延できます。

  • 何が嬉しいか

    • AndroidのContextなど、onCreate以降にしか参照できないもののプロパティをオプショナルにしなくて済む
    • オプショナルだと、?!!などの記述が増えるし、nullの可能性も出てきてしまうので確認などが必要になる。
    • 現在時刻を値として持つ、プロパティ。
    • 初期化されたタイミングの時間の値を持ち、immutableなので変更不可。
import java.time.LocalDateTime

val lazyProperty: String by lazy {
    val dateAndtime: LocalDateTime = LocalDateTime.now()
   "Current date and time: $dateAndtime"
}

fun main(args: Array<String>) {
    println(LocalDateTime.now())
    println(lazyProperty)

    println(lazyProperty)

    ==> 結果
    2020-09-06T21:56:21.118270
    Current date and time: 2020-10-06T21:56:21.118703 => 前のDataTimeより後の時間になっている。
    Current date and time: 2020-10-06T21:56:21.118703 => 同じ値

}
  • lateinitとの違い
    • lateinitでも同じことを実現できますが、lateinitはmutable(あとで、値を変更できる)、lazyはimmutable(初期化した値から変更できない)という違いがあります。

Observable

Observableは、プロパティの値の変更を検知して、それに伴って処理を実行できるというものです。

Observable.kt
var observableName: String by Delegates.observable("Jonathan") {
    property, old, new -> println("$old to $new")
}

fun main(args: Array<String>) {
    observableName = "Joseph" => 結果 "Jonathan to Joseph"
    observableName = "Jotaro" => 結果 "Joseph to Jotaro"
}

まとめ

  • 委譲プロパティとは

    • プロパティのsetter/getter処理を別のオブジェクトに移譲する仕組み
  • 標準ライブラリの2つある。

    • lazyとは、プロパティの初期化を参照されたタイミングまで遅延できる。
    • observableとは、値の変更を検知して処理を実行できる

参考にさせていただいたサイトなど

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UnityAndroidでExportしたprojectをステップ実行

環境1

OS : win10 pro
Unity5.6
AndroidStudio2.3.2

OS : win10 pro
Unity2019
AndroidStudio4

手順

・Unity C#プラグインメソッドを呼び出す。pluginは消す。
・UnityでExportする。
・AndroidStudioでそれを開く。
・AndroidStudioで、C#で呼び出したプラグインメソッドと同じIFのメソッドを作成する。

確認

Java層でブレークポイント停止するのを確認した。

image.png

AndroidJavaObjectの引数は JavaクラスへのFULLPATH / TestMainがクラス名
Unity/Assert/Plugins/Android以下は空にしてEXPORTする。

c#

    string PluginPackageClass = "com.ore.test.TestMain";
    AndroidJavaObject mImageLoader = null;

    public void init_lib()
    {
        m_text.text = "init_lib";
        try
        {
            mImageLoader = new AndroidJavaObject(PluginPackageClass);
            if (mImageLoader != null)
            {
                int t_no = mImageLoader.CallStatic<int>("getNo");
                m_text.text = t_no.ToString();
            }
            else
            {
                m_text.text = "null";

            }

        }
        catch(Exception e)
        {
            Debug.Log(e.ToString());
            m_text.text = "ex a";
        }
    }

ExportしたJava

Android4で開いて、PluginPackageClass を作成する。これに合わせたコードを書いていき、動作確認できたら、その部分をLibにして
Unity/Assert/Plugins/Androidにもっていく。

package com.ore.test;

public class TestMain {
    static int m_no = 0;
    public static int getNo(){
        if ( m_no == 0) {
            return 44;
        }else{
            return 22;
        }

    }

    public  int getNo2(){
        return 44;
    }
}


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

unityのARFoundationでアプリ作ったのに、実機だとカメラが真っ黒になってしまう時の改善策

unityのARFoundationでARのアプリをエラーなく作ったのに、iosやAndroidで実機で立ち上げると、カメラが真っ黒で映らない!!時の改善方法をご紹介します。

改善策

  • 「camera usage description」 を設定していない

Edit→project settings→Player→iosまたはAndroidを選択(実機の環境)
→camera usage descriptionの欄に

Camera required for AR

というように記入してビルド
iosの場合はこれでXcodeの内のinfo.plistにPrivacy - Camera Usage Description が自動的にセットされます。

スクリーンショット 2020-10-06 17.02.29.png

  • XR Plug-in Management の Plug-in Providers を設定(私はこれで解決)

Edit→project settings→XR Plug-in Management→iosまたはAndroidを選択(実機の環境)→ARKitまたはARCoreにチェックを入れる。

スクリーンショット 2020-10-06 17.01.55.png

XR Plug-in Managementはこちらに記載があります。

  • バージョンを最新版にアップデート

Unity、ARFoundation,ios,Android,xcode,ARKit,ARCoreなどなどアップデート
ちなみXcodeのアップデートは容量と時間が必要なのでご注意を笑

どこにもエラーがないのに、、

全て設定したのにカメラが動かないとなると、解決策はここら辺だと思います。
ARにおいてカメラはマストなので、しっかりと解決して実機で確認できらいいですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AIR GOで無料でAndroid/iOSアプリの脆弱性診断

AIR GO」はLINEが提供しているセキュリティープラットフォーム「AIR」のプロダクトの1つで無料でモバイルアプリの脆弱性診断を行ってくれるSaaSです。

AIRのアカウント登録を行えば直ぐに使い始めることができます。

作ったAIRアカウントでログインしてAIR GOを開き、AndroidならAPKファイル、iOSならIPAファイルをアップロードするだけで、直ぐに脆弱性診断が行えます。
URLを入力すると参照先にマルウェアが含まれていないかチェックできます。

image.png

脆弱性診断結果は次のようなレポート形式で表示されます。

test.png

無料でここまで脆弱性診断できるのは素晴らしいですね。

ただし、「一つのアカウントごと1回のみスキャン可能です。」とメッセージがでている通り、1アカウントで1回しか検査ができません…。
「1アカウントにつき1日1回」かと思いきやマジで1回のようです。

じゃあ、それ以降はどうすればいいかの情報が見つからないので確かなことはわかりませんが、おそらく有償版が必要になると思われ。

その有償版のサブスクリプションはAmazon SaaS Storeで買えるようです。
https://www.amazon.co.jp/dp/B0814HJGH9

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Android開発]Javaで画像をサーバーから取得してImageViewに設定しよう!!

説明

画像ファイルをURLで参照して、サーバーから取得する方法です。(非同期処理)

Java

GetImagesUrl
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

public class ImageUrl extends AsyncTask<Integer, Integer, Bitmap> {

    ImageView bmImage;

    public ImageUrl(ImageView bmImage) {
        this.bmImage = bmImage;
    }

    @Override
    public Bitmap doInBackground(Integer... integers) {
        Bitmap image;
        URL imageUrl = null;
        try {
            //引数の数字で取得するURLを変える
            //Staric変数として画像のURLを定義しよう
            if (integers[0] == 0) {
                imageUrl = new URL(Constants.Image1);
            } else if (integers[0] == 1) {
                imageUrl = new URL(Constants.Image2);
            } else if (integers[0] == 2) {
                imageUrl = new URL(Constants.Image3);
            }
            InputStream imageIs;
            imageIs = imageUrl.openStream();
            image = BitmapFactory.decodeStream(imageIs);
        } catch (MalformedURLException e) {
            return null;
        } catch (IOException e) {
            return null;
        }
        return image;
    }

    protected void onPostExecute(Bitmap result) {
        bmImage.setImageBitmap(result);
    }
}

実行

main
 int ImageNum;
 //ImageNumに入っている数値で対象の画像を取得して、ImageViewに設定する
 new ImageUrl((ImageView) view.findViewById(R.id.any_image)).execute(ImageNum);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む