投稿

ラベル(Programming)が付いた投稿を表示しています

Androidでバーコードを読み込む

イメージ
 ふと思い立ちAndroidにてバーコードを読み込めないかと調べてみる ネットで検索するとZXingライブラリというのを使う方法と、Google Playサービスを使う方法が紹介されていた 今回はGoogle Playサービスを使用しバーコードを読み込んでみた よく紹介されている方法はバーコード読み取り用のActivityを別に立ち上げ、その結果を取得する方法である しかしここでは同じActivity内でカメラを使用しバーコードを取得、表示する あくまで簡易的に処理、表示するためのものなのであしからず まずは外部ライブラリを使用するのでgradleを編集する dependenciesに以下を追加 implementation 'com.google.android.gms:play-services-vision:20.1.3' これはバーコードのためだけに入れているので、すべてのPlayサービスを読み込むplay-servicesが入っていれば追加する必要はない AndroidManifest.xmlにカメラ権限を追加 <uses-permission android:name="android.permission.CAMERA" /> Activityでカメラ権限を要求 private class requestPermission() {   final int REQUEST_CODE_CAMERA_PERMISSION = 0x01;   if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_CAMERA_PERMISSION);   } } クラスを作成しFrameLayoutを継承する これはレイアウト下にカメラの映像を表示するTextureView そしてオーバーレイで...

Notificationで押したボタンと受け取った内容が違う場合

AndroidのNotificationのボタンを作る際によく紹介されているのは以下のようなもの Intent intent1 = new Intent("Intent_Action"); intent1.putExtra(name1, value1); PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, (int)System.currentTimeMillis(), intent1, PendingIntent.FLAG_UPDATE_CURRENT); これをbuilderに setAction(pendingIntent1) するわけだが、ボタンを2つに増やすと送られてくるIntentが違うことがあった 2つ目の作りは変数部分の数字が違うだけで以下の通り Intent intent2 = new Intent("Intent_Action"); intent2.putExtra(name2, value2); PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, (int)System.currentTimeMillis(), intent2, PendingIntent.FLAG_UPDATE_CURRENT); このようにして登録すると何故か1番目のボタンを押しているにもかかわらず2番目のボタンのIntentが送られてくる場合がある 原因はPendingIntentの (int)System.currentTimeMillis() の部分にある この部分はRequestCodeとなっており、連続してpendingIntentを作成すると同じ時間の数字がRequestCodeになってしまう RequestCodeが同じになることで後の FLAG_UPDATE_CURRENT で同じものと判断されて上書きした上で発信されてしまう これを防ぐにはそれぞれのPendingIntentには別々のRequestCodeを割り当てることで、問題なく送信することができるようになる

javascriptで指定色を等分したグラデーションの自動作成

分かりづらいタイトルなので実際のものを こんな感じ 実際のコードは以下 *枠線は除いてある <div style="background: linear-gradient(to right , pink 0 , pink 33.32% , palegreen 33.33% , palegreen 66.65% , lightskyblue 66.66% , lightskyblue 100%);"> 指定色 [ pink, palegreen, lightskyblue ] で等分したグラデーションになっている これをjavascriptで自動作成するには function gradientGen(colors) {     var texts = ['to right'];     var ratio = 100 / colors.length;     for (var i = 0; i < colors.length; i++) {         if (i != 0) {             texts.push(colors[i-1] + ' ' + ((ratio * i)-0.01) + '%');         }         texts.push(colors[i] + ' ' + ratio * i + '%');     }     texts.push(colors[colors.length-1] + ' 100%')     return 'linear-gradient(' + texts.join(',') + ')'; } var colorList = ['pink','palegreen','lightsk...

Qtでlibmpvでの動画再生

mpvはWindows/MacOS/Linux対応のメディアプレイヤーである SMPlayerなどのバックエンドとして使われるが単体でも再生が可能 そのmpvにはlibmpvというAPIが付属しておりアプリケーション内で再生や制御を行える 今回はこれを使用し動画再生アプリを作成する まずは.proに以下を追加 既にKeyがある場合はそれに追加で QT_CONFIG -= no-pkg-config CONFIG += link_pkgconfig PKGCONFIG += mpv x11 次にmain.cppのQApplicationの宣言の下辺りに以下を追加 setlocale(LC_NUMERIC, "C"); あとはクラスに書いていくのだが mpvで動画を再生するのには再生先(QWidget)が必要となる なのでQWidgetを継承したカスタムクラスの"Player"を作成し、まとめて書いてしまうことにする QtCreator(QtDesigner)で配置した場合はPlayerへの格上げを忘れないように ヘッダには以下のincludeを追加 #include <mpv/client.h> #include <mpv/render.h> #include <mpv/qthelper.hpp> あわせてprivateに以下を追加 mpv_handle *mpvHandle = nullptr; ソースのincludeの下に以下を static void wakeup(void *ctx) {     Player *player = (Player *)ctx;     emit player->mpv_events(); } そして以下を追加しrun_mpv()はPlayerの初期化の際に読み込む(コメントアウト部分は後述) void Player::run_mpv() {     mpvHandle = mpv_create();     if (!mpvHandle)     ...

AndroidでQtアプリケーションを実行するまで

イメージ
QtはAndroidアプリの作成に対応しており、PC用のアプリケーションと同じように作ることが出来る やりたいことによってはJavaのコードを書く必要もあるが 基本的なことは出来るので、普段Qtを使っている人にはいいだろう でもJavaが使えるのであればJavaで書いたほうがよっぽど楽で良い JDKのインストール  既にインストールされているかもしれないが、今現在入ってるものは   jdk8-openjdk  8   jre8-openjdk  8 Android Studioのインストール  これの設定画面にある  「Android SDK」->「SDK Platform」で 対象バージョンのSDKを入れる  別タブの「SDK Tools」で   Android SDK Build-Tools   Android SDK Platform-Tools   Android SDK Tools   NDK  の4つを入れる Qtのインストール  ManjaroにもQtとQtCreatorのパッケージは存在するが、それでは動かない  Android用のファイルが入っていないためにキットが検出されないのだ  そこで、 Qt公式 からインストーラのqt-opensource-linux-x64-5.12.2.runをダウンロードする  使用したのは上記のオフラインインストーラだが、 ここから オンラインインストーラをダウンロードしても問題ないかと思う ※5.12を入れたところ表面上は問題なかったが、実行時にQPushButtonの長押しなどで QMetaObject::invokeMethod: No such method QPushButton::inputMethodQuery(Qt::InputMethodQuery,QVariant) と出てしまい長押し処理が中断されてしまう現象が発生した 5.9では問題ないので、この問題が発生する場合は 最下の AndroidでQtアプリケーションを実行する方法Old を参照すること...

Qt Tips

Qt Code QtCreatorやQtアプリケーションで日本語入力する sudo apt-get install fcitx-libs-qt5 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/ 内の /libfcitxplatforminputcontextplugin.so を /Tools/QtCreator/lib/Qt/plugins/platforminputcontexts/ と /[version]/gcc_64/plugins/platforminputcontexts/ にそれぞれコピー デバッグログに出力 qDebug() << "Hello World";  >>Hello World int num = 50; qDebug() << "Number is" << num;  >>Number is 50 基本的な変数であれば直接表示してくれる カーソル位置に対象のウィジェットがあるか判定する関数 bool MainWindow::isTarget(QWidget *wid) {   if (!wid->isVisible())     return false;   return wid->rect().contains(wid->mapFromGlobal(QCursor::pos())); } EventFilterの引数にある*QObjectでは マウスカーソル位置のウィジェットを取得するので 対象のウィジェット内にカーソルがあるか判定したい時はこっち connect()やQTimer::singleShot()で変数を渡す QString str = "OK"; QTimer::singleShot(3000,[=](){ qDebug() << str; });   After 3sec >>OK  connect(pushButton,&QPushButton::clicked,[=]()...