Cards Libraryが便利

この度マテリアルデザインに一新しようと思って、SDKとかCompilerとかいろいろ最新にした。

AppCompatにするのは結構大変だったけど、まぁ先人のコードをまねて作った。

そのときほとんどのUIをCardViewとrecycleViewでやろうと思っててAndroid design support だけで作ろうかなーって思ってたんだけどCards Libraryが便利!

Gradleで簡単に追加できるからこーゆーライブラリはどんどん使うべきなんだなと思った。

あとちょっと悩んだのがAndroid が自動的にxmlnsを追加するんだけど、それだとThumbnailの画像がどうやっても表示されなかった。

原因は↓だった

xmlns:card="http://schemas.android.com/apk/res/android"
xmlns:card="http://schemas.android.com/apk/res-auto"

を追加するのが正解!

BluetoothSPPLibraryでよくLostしてた問題

BluetoothSPPLibraryは結構優秀なライブラリーで使用していたのだけど、回転時とか、Activityから離れた時にLostすることが多かった。でもonDestoryとかでbt.stopとかしていたらまぁ、動く事が多かったからそのまま放置していた。

しかし、前にも書いたかもしれないけどなぞのActivityの死亡が時々見られた。

業務ソフトでたまに死んでは話にならないので根本的に見直すことにした。

結論。

globalsで定義して対応。

たったこれだけかもしれないけどとりあえず今のところAcvitiy死なないし、しかもLostもなくなった。

Globals:

public class Globals extends Application {
    BluetoothSPP bt;

 

MainActivity:

@Override
protected void onStart() {
    super.onStart();
    
    if(globals.bt==null)globals.bt = new BluetoothSPP(this.getApplicationContext());
    if(!globals.bt.isBluetoothEnabled()) {
        globals.bt.enable();
        Toast.makeText(this, "Bluetoothを有効にしています", Toast.LENGTH_SHORT).show();
    } else {
        if(!globals.bt.isServiceAvailable()) {
            globals.bt.setupService();
            globals.bt.startService(BluetoothState.DEVICE_OTHER);
            setup();
        }
    }

    if(!globals.bt.isBluetoothAvailable()) {

        Toast.makeText(this, "Bluetoothが存在しません。", Toast.LENGTH_SHORT).show();
        // any command for bluetooth is not available
    }

たったこれだけでとりあえずタスク切り替えても切断されず動いた。

あとはactivityが謎の死を遂げないかを祈るだけである。

lsolesen/pel(PHP Exif Library)の使い方

PHPでEXIFを使いたいと思ってたんだけど、公式の通りやっても動かない。
set_include_path(‘library\lsolesen-pel-308f226\src’ . PATH_SEPARATOR . get_include_path());

とかやれって書いてるのに動かないぞ!と

Fatal error: Class 'PelJpeg' not found in

がでる

結論として

require_once "pel/autoload.php";
use lsolesen\pel\PelJpeg;
use lsolesen\pel\PelTag;
use lsolesen\pel\PelIfd;

で動いた。

バージョンが古かったらしい。たぶん。

 

Win8.1を使い続けると何故かCドライブの空き容量が減っていく問題

Win8.1を使い続けると何故かCドライブの空き容量が減っていく問題が起こった。

というか何度か起こってたんだけど。

結論は大体自分の場合の原因はIndexファイルだ。

Windows.edb

が今回50GBにもなってた。

このファイルが曲者でファイルサイズが大きいものとかで検索してもpermissionを与えてないと出てこないから引っかかってこなかった。

まぁシステムからWindows Search Index的なのを無効にしてあげると治るはず。

検索遅くなるけどね。

待てないぐらい遅くなったらまた有効にするかな。

でも適度に最適化させるといいのかな。

よくわからないのでとりあえずしばらくは無効

Screenshot 2015-09-28 14.25.19

usb-serial-for-android

https://github.com/mik3y/usb-serial-for-android

でのgradleの追加の仕方がよくわからなかった。

usb-serial-for-android-v010.jar

をlibsに追加してやろうとしたけどなんかUsbSerialPortが足りなさそうなので最新版にしようとした。

結論:

gradleに

allprojects {
    repositories {
        maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
        mavenCentral()
    }
}

dependency:

compile 'com.hoho.android:usb-serial-for-android:0.2.0-SNAPSHOT@aar'

でいけた。

謎なカメラのorientation

今までintentで内部のカメラアプリを起動さしてjpgをgetしてたけど、今回シャッターの制御が必要になったので自作カメラアプリを作った。

なぜか一番悩んだのが画像の向きだ。

横にしたり縦にしたりしても、Exif情報がなんか1に固定されている。

仕方ないので

protected void configureCameraParameters(Camera.Parameters cameraParams, boolean portrait) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { // for 2.1 and before
        if (portrait) {
            cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_PORTRAIT);
        } else {
            cameraParams.set(CAMERA_PARAM_ORIENTATION, CAMERA_PARAM_LANDSCAPE);
        }
    } else { // for 2.2 and later
        int angle;
        int angle2;
        Display display = mActivity.getWindowManager().getDefaultDisplay();
        switch (display.getRotation()) {
            case Surface.ROTATION_0: // This is display orientation
                angle = 90; // This is camera orientation
                angle2=0;
                break;
            case Surface.ROTATION_90:
                angle = 0;
                angle2=270;
                break;
            case Surface.ROTATION_180:
                angle = 270;
                angle2=180;
                break;
            case Surface.ROTATION_270:
                angle = 180;
                angle2=0;
                break;
            default:
                angle = 90;
                angle2=90;
                break;
        }
        Log.v(LOG_TAG, "angle: " + angle);
        onOrientationChanged(angle2);
        mCamera.setDisplayOrientation(angle);
    }

 

public void onOrientationChanged(int orientation) {
    //if (orientation == ORIENTATION_UNKNOWN) return;
    android.hardware.Camera.CameraInfo info =
            new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(mCameraId, info);
    orientation = (orientation + 45) / 90 * 90;
    int rotation = 0;
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        rotation = (info.orientation - orientation + 360) % 360;
    } else {  // back-facing camera
        rotation = (info.orientation + orientation) % 360;
    }
    Camera.Parameters cameraParams = mCamera.getParameters();
    cameraParams.setRotation(rotation);
    mCamera.setParameters(cameraParams);
}

で対応さした。

謎なのがDisplayのangleとカメラのangleが違うところだ。

よくわからない処理が行われているのだろうきっと。

これで動いたからよしとする。

DialogFragmentでViewPager使って回転時に落ちる問題

回転時にまつわる問題。

DialogFragmentでViewPager使ってるやつだと回転時に

java.lang.IllegalStateException: Activity has been destroyed

で落ちることがある。てかメモリが弱い機種だとすぐ落ちる。

もう

@Override
 public int show(FragmentTransaction transaction, String tag) {
    try {
        return super.show(transaction, tag);
    } catch (IllegalStateException e) {
        // ignore
    }
    return -1;
}

@Override
public void show(FragmentManager manager, String tag) {
    try {
        super.show(manager, tag);
    } catch (IllegalStateException e) {
        // ignore
    }
}

で対応しようとしたけどなんか無理っぽい。

わけわからんなーと思いつつどこで落ちるんだろうと思ってfragmentのサイクルをLOGしてみた

/***
 * Activityに関連付けされた際に一度だけ呼び出される
 */
static final String TAG = "FragmentTest";
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    Log.d(TAG, "onAttach");
}

/***
 * Fragmentの初期化処理を行う
 */

/***
 * Activityの「onResume」に基づき開始される
 */
@Override
public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume");
}

/***
 * Activityが「onPause」になった場合や、Fragmentが変更更新されて操作を受け付けなくなった場合に呼び出される
 */

/***
 * フォアグラウンドでなくなった場合に呼び出される
 */
@Override
public void onStop() {
    super.onStop();
    Log.d(TAG, "onStop");
}

/***
 * Fragmentの内部のViewリソースの整理を行う
 */
@Override
public void onDestroyView() {
    super.onDestroyView();
    Log.d(TAG, "onDestroyView");
}

/***
 * Fragmentが破棄される時、最後に呼び出される
 */
@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy");
}

なぜか落ちなくなった。

↑の分を足すだけで解決した。

わけわからない・・・・

 

追記:ダメでした

Mac買おう

いよいよと言うかこの度、iPhone、iPadアプリ作る必要が出てきた。

知っての通りMacでしかXcodeが起動できない。

しかしObjective-cとか触ったことないぞー

Swiftとか新しいのあるっぽいけどやっぱり蓄積された知識的にObjective-cを選ぶことになるだろうなぁ

がんばろう

Android Support Repositoryが見つけられない

Gradleのお話

なんか今までサポートライブラリーv4を使うときはEclipseからの継承でlibsにandroid-support-v4.jarを突っ込んで使ってた。

でもGradleはなんかすげースゴイらしくてなんか使おうと思ってたけど不思議なことに↓のようなエラーがずっとでてた。

Error:Could not find com.android.support:support-v4:22.2.0.
Searched in the following locations:
https://repo1.maven.org/maven2/com/android/support/support-v4/22.2.0/support-v4-22.2.0.pom
https://repo1.maven.org/maven2/com/android/support/support-v4/22.2.0/support-v4-22.2.0.jar
Required by:
:MedicalMonitor:unspecified

Please install the Android Support Repository from the Android SDK Manager.
<a href=”openAndroidSdkManager”>Open Android SDK Manager</a>

だが、ここにきてcompile ‘com.roomorama:caldroid:2.1.0’を使う必要があった。

どうもそれにはcom.android.support:support-v4:22.2.0が必要っぽい

さて困ったぞと

結局何が悪かったかというと

task copyLibs(type : Copy) {
    configurations.compile.each {
        from it.toString()
        into 'libs'
        exclude {
            new File('libs', it.name).exists()
        }
    }
}

というタスクがgradleで動いてたのが原因だった。

なんかよくわからないままコピペ放置されていたプログラムだ。

これを消すとすんなり動いた。

動いたのだから深いことは考えない。

しかしこれのせいで3日も無駄になってしまった。

頑張って早く作らないと