20210103のAndroidに関する記事は6件です。

【Unity VR】備忘録 GVRを使った際にAndroid端末で2画面にならなかったときの話。

UnityVersion : 2019.4.16f

GVRの設定を終わらせ、
Cardboardの設定も済ませたが、
Android実機で2画面にならなかった。

Screenshot_20210103-224833.jpg

設定を見直したが、
マニュアル通りの設定になっている。

おかしい。

ジャイロセンサーも効かない状態。

何度か繰り返しても1画面のままなので、
ふとした瞬間にある事がよぎった。

「もう一回CardboardのSDKインストールしてみるか。。。」

VR SDKsのCardboardを削除して、もう一度プラスボタンを押し、
CardboardSDKを再インストール。
スクリーンショット 2021-01-03 224609.png

これが大当たり。

Screenshot_20210103-224828.jpg

ようやく動作して一安心。

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

opencv4 系のsdkでonCameraViewStartedが呼ばれないエラー回避備忘録

概要

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial2_activity_surface_view);
        mOpenCvCameraView.setVisibility(CameraBridgeViewBase.VISIBLE);
        mOpenCvCameraView.setCvCameraViewListener(this);
        mOpenCvCameraView.setMaxFrameSize(IMG_Width,IMG_Height);
        mOpenCvCameraView.setClickable(true);

のようにopencvのCameraViewを使おうとしても、

    public void onCameraViewStarted(int width, int height) {
        Log.d(TAG, "onCameraViewStarted w:"+width+"  h:"+height);

    }

で定義されたonCameraViewStarted が呼ばれないというエラーが発生していた。

解決策

opencv3系で動いていたcameraview のコールバックは4系だと書き直す必要があるようだ。
ここのチュートリアルを一回コピーし、そこから徐々に自分のやりたかったことに調整すると良い。

https://github.com/opencv/opencv/tree/master/samples/android/tutorial-1-camerapreview

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

android studio データバインディング生成で困った話

データバインディングの基礎

データバインディングを有効にする

1.build.gradle(Module:app)を開きます。
2.androidセッション内の閉じる}の前に、buildFeaturesセクションを追加してdataBindingをtrueにします

build.gradle(Module.app)
android {

   buildFeatures {
    dataBinding true
   }
}

4.プロジェクトを同期します。プロンプトが表示されない場合は、[ファイル]> [プロジェクトをGradleファイルと同期]を選択します。

Fragmentを追加する

1.追加するパッケージで右クリックし、new>Fragment>追加したいFragmentを選択する
2.フラグメント名を変更し、完了を押すとfragmentクラスファイルとfragment.xmlが生成される

データバインディングを使用できるようにレイアウトを変更する・・・()

生成されたときのFragment.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TitleFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>
変更後のfragment.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.bookmanagement.TitleFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </LinearLayout>
</layout>

Fragmentクラスファイルを変更する

fragment.kt
package com.example."プロジェクト名"

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 * Use the ["Fragmentクラス名".newInstance] factory method to
 * create an instance of this fragment.
 */
class "Fragmentクラス名" : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout."Fragment.xml名", container, false)
    }

    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment Fragmentクラス名.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            TitleFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }
}
</layout>

Fragmentクラスファイルを変更する

変更前nfragment.kt
package com.example."プロジェクト名"

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 * Use the ["Fragmentクラス名".newInstance] factory method to
 * create an instance of this fragment.
 */
class "Fragmentクラス名" : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
    //変更する場所start
        return inflater.inflate(R.layout."Fragment.xml名", container, false)
        //変更する場所end
    }

    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment Fragmentクラス名.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            TitleFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }
}
</layout>
変更後のfragment.kt
package com.example.bookmanagement

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
//importの追加
import androidx.databinding.DataBindingUtil
import com.example.bookmanagement.databinding.FragmentTitleBinding

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 * Use the [TitleFragment.newInstance] factory method to
 * create an instance of this fragment.
 */
class TitleFragment : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment

    //変更箇所start
        val binding = DataBindingUtil.inflate<FragmentTitleBinding>(
            inflater,
            R.layout.fragment_title,
            container,
            false
        )
        return binding.root
    //変更箇所end
    }

    companion object {
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment TitleFragment.
         */
        // TODO: Rename and change types and number of parameters
        @JvmStatic
        fun newInstance(param1: String, param2: String) =
            TitleFragment().apply {
                arguments = Bundle().apply {
                    putString(ARG_PARAM1, param1)
                    putString(ARG_PARAM2, param2)
                }
            }
    }
}

以上の手順でデータバインディングが生成されます
java(生成済み)>com.example.bookmanagement>databinding>生成される場所
https://gyazo.com/e2e2aed05f0168a23fcb327a34a98d85
という風に生成されるはずのが通常です

データバインディングで失敗したやり方・・・

1.databindingを有効にする
2.fragmentを追加する
3.fragmentクラスを変更する(ここで詰まった・・・)
手順でfragment.xmlを変更せずにクラスを変更したためdatabindingが自動生成されずコーディングでinflate<>部分でerrorが発生していた
(FragmentTitleBindingがないため)

fragment.kt
 ): View? {

        val binding = DataBindingUtil.inflate<FragmentTitleBinding>(
            inflater,
            R.layout.fragment_title,
            container,
            false
        )
        return binding.root
    }

以上の手順でちゃんと理解せずにやっていたためdatabindingが生成されず詰まってしまいました

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

cameraX と opencvでのruntimeで Caused by: java.lang.ClassCastException: Bootstrap method returned null camerax となるエラー回避備忘録

概要

アプリケーションビルド後、

Caused by: java.lang.ClassCastException: Bootstrap method returned null camerax

となって初期化に失敗する。

解決策

この@iwatake2222さんや@kk2170さんの
以下のありがたい記事を参考にし、

https://qiita.com/iwatake2222/items/c0ebe6d84afdef57aab3
https://qiita.com/kk2170/items/472dddb86b373f52f8e9

app:build.gradle

にJava8機能を有効化するような記述を追加する必要があった。

    android {
        compileOptions {
            targetCompatibility = "8"
            sourceCompatibility = "8"
        }
    }

これを行った時は念のため

build から
clean project を実行しておく。

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

java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found エラー回避備忘録

概要

java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found

がruntimeのエラーとして吐き出される。

回避方法

app:build.gradle にて

apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.example.test10"
        minSdkVersion 27
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }

のところの

            cmake {
                cppFlags ""
            }

に追加して、

            cmake {
                arguments "-DCMAKE_BUILD_TYPE=Release" ,"-DANDROID_STL=c++_shared", '-DANDROID_TOOLCHAIN=clang'
                cppFlags ""
            }

とする。

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

Dependent features configured but no package ID was set. エラー回避備忘録

概要

Opencv (今回は4系)をandroid app に New Module として追加し、
サンプルを実行しようとすると、

コンパイル時に

Dependent features configured but no package ID was set.

となった時の回避備忘録

方法

追加したモジュール(今回の環境では Module: java)
以下のbuild.gradle において、1行目の

- apply plugin: 'com.android.application'
+ apply plugin: 'com.android.library'

とした。

また、
同じファイルの、

    defaultConfig {
        applicationId "org.opencv"
    }

applicationIdをコメントアウトした。

    defaultConfig {
        //applicationId "org.opencv"
    }

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