2023년 8월 31일부터 플레이 스토어에 등록하기 위해서는 앱의 Target API를 33이상으로 해야 한다.

Android 13에 맞춰서 사용하던 권한을 변경했는데, Album에서 권한이 허용되지 않았다고 얼럿이 뜬다.
yanzhenjie:album는 최종 업데이트가 2018년이고, 내부적으로 권한을 체크해서 얼럿을 띄우는데, 한 개발자가 Android 13에 맞춰서 업데이트를 해놨다(Thanks)

라이브러리 참조방법
https://jitpack.io/#hisetu/Album/android_13-SNAPSHOT

 

JitPack | Publish JVM and Android libraries

JitPack makes it easy to release your Java or Android library. Publish straight from GitHub or Bitbucket.

jitpack.io

깃헙주소
https://github.com/hisetu/Album 

 

GitHub - hisetu/Album: :watermelon: Album and Gallery for Android platform.

:watermelon: Album and Gallery for Android platform. - GitHub - hisetu/Album: :watermelon: Album and Gallery for Android platform.

github.com

 

페이지 이동 시 도메인을 확인하여 webView.removeJavascriptInterface(SCRIPT_NAME); 을 호출.

 

상황에 따라 handler를 이용하거나 runOnUiThread사용

 

 

----------------------- 추가 --------------------

위의 방법은 HTTPS를 사용하거나, 특정 몇개의 도메인만 사용하는 경우에만 허용됨.

사이트 내부에서 다른 외부 사이트의 이미지들을 로딩하는 경우에는 사용할 수 없는 방법으로, 이 경우에는 prompt를 이용하여 비슷하게 구현가능

1. 서버에서 HTTPS 사용.

 

2-1. 서버에서 HTTPS사용 불가 시 manifest파일의 application태그에 android:usesCleartextTraffic="true" 속성 추가

2-2. 서버에서 HTTPS사용 불가 시 resource/xml폴더에 임의의 xml 파일 생성 후 다음과 같은 내용을 입력 후 manifest파일의 application태그에 android:networkSecurityConfig="@xml/추가한 파일명" 속성추가

<network-security-config>
<domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">127.0.0.1</domain>
</domain-config>
</network-security-config>

 

예전엔 SqliteOpenHelper 상속받아서 썼었는데, 테이블/쿼리 관련해서 간단히 선언만하면 자동으로 구현소스를 만들어 주는게 있다.


나중에 필요할때 써먹어야겠다. (그동안 만들어 놨던 클래스 안녕 ㅠㅠ)


https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#0

a태그에 download 속성을 추가한다. 값은 임의 지정가능
<a href="https://www.xpressengine.com/layouts/xe_v4/img/bi-lg.png&quot; download="image">image_down</a>

아래의 내용을 app의 build.gradle에 추가하지 않으면 aar파일을 인식 할 수 없다


repositories {
mavenCentral()
flatDir {
dirs 'libs'
}
}

aar파일은 app/libs에 복사 후 아래와 같은 내용을 추가한다.


dependencies {
...
compile '{패키지명}:{aar 파일 이름}:{aar버전}@aar'
}


1. 각각의 센서를 저장한다.

sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
sensorAccel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorMag = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

2. 센서 등록은 onResume에서 센서 해제는 onPause에서 한다.

protected void onResume() {
super.onResume();
sensorManager.registerListener(this, sensorAccel, SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(this, sensorMag, SensorManager.SENSOR_DELAY_NORMAL);
}

protected void onPause() {

super.onPause();

sensorManager.unregisterListener(this);

}

3. 가속도 센서와 자기장 센서의 값을 모두 저장한다.

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accel[0] = event.values[0];
accel[1] = event.values[1];
accel[2] = event.values[2];
}
else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
mag[0] = event.values[0];
mag[1] = event.values[1];
mag[2] = event.values[2];
}

4. 저장한 센서들의 값을 가지고 SensorManager.getOrientation() 메서드를 호출하여 기울기를 구한다.

SensorManager.getRotationMatrix(r, null, gravity, geomagnetic);
SensorManager.getOrientation(r, values);

final int azimut= (int) ( Math.toDegrees(values[0] ) + 360 ) % 360;
final int pitch = (int)Math.toDegrees(values[1]);
float rr = -values[2] * 180 / (float)Math.PI;

if (Math.abs(rr) > 90) {
    if (rr > 0)
        rr = 90 - (rr - 90);
    else
        rr = -90 + Math.abs(rr + 90);
}
final float roll = rr;

if (pitch <= -20) {
if (roll > 10) {
sb.append("left");
if (roll > 60)
sb.append(" fast");
else if (roll > 30)
sb.append(" normal");
else
sb.append(" slow");
}
else if (roll < -10) {
sb.append("right");
if (roll < -60)
sb.append(" fast");
else if (roll < -30)
sb.append(" normal");
else
sb.append(" slow");
}
}
else if (pitch >= 20) {
if (roll > 10) {
sb.append("left");
if (roll > 60)
sb.append(" fast");
else if (roll > 30)
sb.append(" normal");
else
sb.append(" slow");
}
else if (roll < -10) {
sb.append("right");
if (roll < -60)
sb.append(" fast");
else if (roll < -30)
sb.append(" normal");
else
sb.append(" slow");
}
}

기울기 텍스트에 대한 수치는 임시로 넣은 값이다.


참조: https://developer.android.com/reference/android/hardware/SensorManager.html













출처: http://itmir.tistory.com/548



private float mTouchX, mTouchY;
private int mViewX, mViewY;
 
private OnTouchListener mViewTouchListener = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
 
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
 
            mTouchX = event.getRawX();
            mTouchY = event.getRawY();
            mViewX = mParams.x;
            mViewY = mParams.y;
 
            break;
 
        case MotionEvent.ACTION_UP:
            break;
 
        case MotionEvent.ACTION_MOVE:
            int x = (int) (event.getRawX() - mTouchX);
            int y = (int) (event.getRawY() - mTouchY);
 
            mParams.x = mViewX + x;
            mParams.y = mViewY + y;
 
            mManager.updateViewLayout(mView, mParams);
 
            break;
        }
 
        return true;
    }
};


백키 누를 경우 잠금화면이 보여짐

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);



백키 누를 경우 바탕화면이 보여짐(화면잠금 해제)

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

       | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD

       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

SELECT * FROM mytable LIMIT N OFFSET (SELECT COUNT(*) FROM mytable) - N;


출처: http://stackoverflow.com/questions/14018394/android-sqlite-query-getting-latest-10-records

+ Recent posts