2019.06.16 22:59


Context is removed when activity called onDestroy().

So when after called context, It goes to error.

So please reference next solution code.

 

# Example Resolution Code

if ( context instanceof Activity ) {
    Activity activity = (Activity)context;
    if ( activity.isFinishing() ) {
        return;
    }
}
Toast.makeText(context, "I'll do things here that depend on my context and views being valid", Toast.LENGTH_SHORT).show();

 

 

#Reference Link

https://stackoverflow.com/questions/7856103/how-can-i-tell-if-my-context-is-still-valid



Posted by injunech
2019.05.15 02:03


1.새로고침하고자 하는 Activity의 Context를 전역변수로 만들어 준다.

public static Context CONTEXT;

 

2.onCreate 부분에서 Context의 값을 지정해준다.

 CONTEXT = this; 

 

3.다른 Activity에서 위의 Context의 onResume() 메서드를 호출한다

 ((ListActivity)ListActivity.CONTEXT).onResume(); 

 

※ 해당 내용은 onResume() 메서드를 통해 새로고침한다는 가정하에 작성한 내용.

onResume() 메서드에 새로고침에 관한 내용이 있어야 한다.

@Override
public void onResume() {
   super.onResume();
   
   ListView.notifyDataSetChanged();
   
}


Posted by injunech
2019.02.13 00:48


[Android] calling ui thread from worker thread



Method compress must be called from the worker thread, currently inferred thread is UI thread less... (Ctrl+F1)  

Inspection info:Ensures that a method which expects to be called on a specific thread, is actually called from that thread. For example, calls on methods in widgets should always be made on the UI thread


위와 같이 View와 같은 Class내에서 Bitmap Compress 함수 사용시

Activity의 context 의 runOnUiThread 에서 수행해주도록 아래와 같이 구현한다.


public static Bitmap croppedBitmap;
public static File croppedFile;

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/" + Data.PIC_FOLDERNAME + "/" + Data.PIC_FILENAME);
if (dir.exists() == false) {
dir.mkdir();
}

String path = sdCard.getAbsolutePath() + "/" + Data.PIC_FOLDERNAME + "/" + Data.PIC_FILENAME + "/" + Data.CROP_FILENAME;
croppedFile = new File(path);

((CropActivity) getContext()).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread
Bitmap croppedBitmap = CropImageView.croppedBitmap;
FileOutputStream out;
try {
out = new FileOutputStream(croppedFile);
croppedBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (Exception e) {
e.printStackTrace();
}
}
});


아래와 같이  UI Thread 이용하며 CropActivity는 위의 코드가 동작하는 View와 같은 Class가 호출되어 Activity 로 동작하는 Class 이다.

    ((CropActivity) getContext()).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread


}
});







Posted by injunech
2019.02.09 19:02


Google Android Sample Code Git

구글 안드로이드 샘플 코드 Git


Google Samples

https://github.com/googlesamples



Google Play In-app Billing Samples

https://github.com/googlesamples/android-play-billing






Posted by injunech
2019.02.04 21:36


구글계정 지급보류 문제해결


구글 개발자 계정에서 아래와 같은 에러 문구가 발생하는 경우

구글에 문의를 해서 원인 확인과 해결요청을 해야 한다.


은행 계좌가 잘못된 경우라면 쉽게 해결되지만 그밖에 경우라면 복잡하고 오래 걸리기 때문에

이러한 문제가 발생한 즉시 구글에 문의를 하는것이 좋다.


Contact us about your payments account status

You're currently unable to receive payouts because there's a hold on your payments account.




상단 물음표를 눌러서 구글 지원팀에 이메일로 문의하기 요청하고

관련 내용에 대해 문의요청한다.




혹은 위와 같이 Google Play Console 지원팀에 문의하기를 통해

채팅/이메일 두가지 방법을 선택해서 확인 요청할수 있다.




Posted by injunech
2019.01.28 02:31


Android 파일명 변경시


File beforeFileName;
File afterFileName;
 
beforeFileName = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "folder name", "target file name");
afterFileName = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "folder name", "modifi file name");
 
if (beforeFileName.renameTo(afterFileName))
    Toast.makeText(getApplicationContext(), "success!", Toast.LENGTH_SHORT).show();
else
    Toast.makeText(getApplicationContext(), "faile", Toast.LENGTH_SHORT).show();




Posted by injunech
2019.01.20 20:39


안드로이드 Task의 종료시점 확인하기

배경

안드로이드는 OS에 의해 프로세스가 강제종료 되는 시점을 알 수 없다. Application 클래스의 onTerminate()메서드조차 가상머신에서만 동작하고 실제 디바이스에서는 동작하지 않는다고 문서에 명시되어 있다.(실제로도 동작하지 않는 것을 확인했다.)

Task?

안드로이드 프로세스와 태스크의 차이

안드로이드에는 Task라는 개념이 있다. Task는 어떤 앱이 실행되면서, 관련 컴포넌트(엑티비티, 서비스, 리시버, 프로바이더)를 묶어놓은 그룹의 개념으로, 프로세스와는 약간 다르다. 그렇지만, 일반적인 앱이라면 하나의 앱을 실행할 때, 하나의 프로세스가 생기며, 그 프로세스에서 실행되는 모든 컴포넌트들은 하나의 Task로 묶이게 된다. 사용자가 확인할 수 있는 최근에 실행된 앱 보기에 나오는 하나의 단위가 바로 Task 이다.


Task 종료시점 알기

OS가 프로세스를 강제종료 시키는 시점은 알 수 없지만, Task가 종료되는 시점은 알 수 있다. 즉, 사용자가 최근에 실행된 앱 보기 화면에서 태스크를 지웠을 때의 시점을 감지할 수 있는 것이다. 한개의 프로세스와 한개의 Task로 구성되어 있는 앱이라면, 이 방법을 통해 사용자가 앱을 강제종료 시키는 시점 정도는 핸들링 할 수 있다.(이것은 프로세스가 종료되는 것과는 엄밀히 다르다. 그러므로, 프로세스의 종료시점과 혼동하여 사용하면 부작용을 초래할 수 있다.)
Service 클래스에는 Task가 종료되었을 때 콜백을 받는 onTaskRemoved()메서드가 존재한다. 이 메서드를 이용해, Task의 종료시점을 잡을 수 있다.


적용방법

1.Manifest에 서비스를 등록한다. 이 때, android:stopWithTask 속성을 반드시 false로 설정해야 한다. true로 설정하면 onTaskRemoved()메서드가 호출되지 않는다.
<application
    ...>
    ...
    <service android:name=".TestService"
                android:stopWithTask="false" />
    ...
</application>
2.Manifest에 선언한 Service를 선언하고, onTaskRemoved()메서드를 오버라이드하고 필요한 내용을 구현한다.
Note : super.onTaskRemoved()를 호출하게 되면, Task가 종료되는 시점에서 프로세스는 재시작된다.(Task는 안보이고 프로세스만 살아있는 형태) Task가 종료되는 시점에서 서비스도 같이 종료시키려면 stopSelf() 메서드를 호출해준다.
public class TestService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    
    @Override
    public void onTaskRemoved(Intent rootIntent) {
        Logger.logWarn("onTaskRemoved - " + rootIntent);
        // 여기에 필요한 코드를 추가한다.,
        
        stopSelf();
    }
}
3.해당 Service를 앱의 시작점에서 시작한다.일반적으로 앱의 시작점은 Application의 onCreate()나 스플래쉬 엑티비티의 onCreate() 메서드일 것이다. Manifest에 등록된 리시버가 없다면, 두가지 방법은 차이가 없지만, 외부 액션을 받는 리시버가 등록되어 있다면, 그 외부액션을 받았을 때 Application의 onCreate()가 실행되기 때문에, 오동작할 우려가 있으므로, 그럴때는 가급적 엑티비티의 onCreate()에서 시작하도록 한다.
public class SplashActivity extends Activity {
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startService(new Intent(this, TestService.class));
    }
    ...
}




Posted by injunech
2019.01.06 03:00


TextView 줄간격, 자간, 장평 설정하기


ㆍ 줄간격 : lineSpacingExtra, lineSpacingMultiplier

ㆍ 자간 : letterSpacing

ㆍ 장평 : textScaleX



줄 간격


android:lineSpacingExtra ="0dp"(기본)


android:lineSpacingExtra ="5dp"


android:lineSpacingMultiplier="1"(기본)


android:lineSpacingMultiplier="1.5"




자간


android:letterSpacing="0"(기본)


android:letterSpacing="0.2"


장평


android:textScaleX="1"(기본)


android:textScaleX="1.5"(기본)







Posted by injunech
2018.12.26 01:41


스크롤바(ScrollBar) 색상, 위치 변경해보기


ㆍ스크롤바의 위치와 색상 설정 방법.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:orientation="vertical"
android:gravity="center">

<ScrollView
android:layout_width="300dp"
android:layout_height="300dp">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="어쩌구"
android:textColor="#000000" />
</ScrollView>

</LinearLayout>


스크롤바를 항상보이게 하기

android:scrollbarFadeDuration = "0"
android:scrollbarAlwaysDrawVerticalTrack = "True"

혹은

android:scrollbarDefaultDelayBeforeFade="500000"


스크롤바 위치를 우측에서 좌측으로 바꾸기

android:VerticalScrollbarPosition = "left"


스크롤바가 밖으로, 내부 콘텐츠를 가리지 않도록 설정하기

android:scrollbarStyle="outsideInset"


스크롤바를 원하는 그림으로 변경하기, Size 변경하기


android:scrollbarThumbVertical="@drawable/scroll_thumb"
android:scrollbarSize="2dp"

스크롤바 배경 라인 변경하기


android:scrollbarTrackVertical="@drawable/scroll_track"



















Posted by injunech
2018.08.19 00:08


아래와 같은 AndroidRuntime Error 메시지 발생시

android.os.FileUriExposedException: file:///storage/emulated/0/1534602883975.jpg exposed beyond app through ClipData.Item.getUri() 

android.os.StrictMode.onFileUriExposed(StrictMode.java:1960) 

at android.net.Uri.checkFileUriExposed(Uri.java:2356) 


위와같이 FileUriExposedException 발생하는 경우 


안드로이드 7.0 부터 Uri.fromFile() 사용 시 개인 파일의 보안을 강화하기 위해 개인 디렉토리의 액세스를 제한하여 SecurityException과 FileUriExposedException이 발생할 수 있다.

따라서 Uri클래스의 fromFile()를 통해 얻어온 Uri(“file://…”)가 카메라앱으로 공유함으로써 발생한 오류이다.

따라서 해결책으로 FileProvider 사용을 해야 한다.


FileProvider 관련 Google Android 링크

android 7.0 관련 수정사항



FileProvider 사용방법

  1. res> xml> file paths.xml 파일 생성

 

  1. AndroidManifest.xml에 Provider 추가.

 

  1. Uri.fromFile() 대신 FileProvider.getUriForFile

 

 



Posted by injunech