- 投稿日:2021-01-03T22:50:33+09:00
【Unity VR】備忘録 GVRを使った際にAndroid端末で2画面にならなかったときの話。
- 投稿日:2021-01-03T21:00:47+09:00
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
- 投稿日:2021-01-03T11:16:12+09:00
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.ktpackage 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.ktpackage 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.ktpackage 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が生成されず詰まってしまいました
- 投稿日:2021-01-03T10:44:12+09:00
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
を実行しておく。
- 投稿日:2021-01-03T10:14:21+09:00
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 "" }とする。
- 投稿日:2021-01-03T10:01:10+09:00
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" }