Move IMAP Mail Message: The requested folder could not be found.

 

 

메일함을 못찾아와서 발생하는 에러....

뻔히 있는데 왜 찾질 못하니..... 너만 못찾아ㅠㅠ

 

해결방안 : 속성창을 잘 확인해보자~

Move IMAP Mail Message To Folder 액티비티 속성

- FromFolder : 이동할 메일이 있는 폴더

- MailFolder : 메일이 이동할 폴더

 

 

두 가지 속성을 잘 확인해봐야한다...!!

그리고 폴더명의 스펠링같은걸 잘 확인해야하고,

예를 들어 A안에 B에 넣어야하면 A\B를 해야한다

 

 

 

서버나, 오케스트레이터를 일체 사용하지 않고 프로젝트를 진행해야 하며, 로봇의 형태는 Attended.

Window에 있는 "자격 증명 관리자" 에서 크리덴셜을 관리하는 방법이다!!

 

윈도우 자격 증명 관리지 (웹 자격 증명이 아닌 Window 자격 증명에서 작업을 해야한다.)

 

근데 여기서 일일이 추가해줄 필요는 없고, 액티비티로 Window 자격 증명을 추가해줄 수 있다.

 

 

** 관련 페이지

https://www.uipath.com/kb-articles/how-to-work-with-windows-credentials

 

How to work with Windows Credentials

Work with Windows Credentials in UiPath. Train and design robots that drive the user interface like humans. Automate rule based business and IT processes

www.uipath.com

https://docs.uipath.com/activities/docs/add-credential

 

Add Credential

UiPath.Credentials.Activities.AddCredential Stores a specified credential in the Windows Credential Manager with a custom persistence type, and returns a boolean value to let you know if the process was successful or not. Properties Input Username - The us

docs.uipath.com

https://docs.uipath.com/activities/docs/get-secure-credential

 

Get Secure Credential

UiPath.Credentials.Activities.GetSecureCredential Retrieves the credentials from a specified target from the Windows Credential Manager as a secure string (password) and a string (username). Additionally, a boolean value is returned to let you know if the

docs.uipath.com

 

 

1. 일단 첫번째로 Credential 과 관련된 패키지를 설치해야한다.

 

 

 

2. 두번째는 자격증명을 추가해주는, Add Credential 액티비티이다.

Add credemtial 액티비티
Add Credential 액티비티 속성

 

여기에 나와있는 username이 아이디와 이메일이 되고, password는 비밀번호가 된다.

Target은 이 크리덴셜의 이름이라고 생각하면 된다.

 

주의해야할점이 Credential Type 과 Persistance Type 속성인데 다음을 참고하시길...

CredentialType : 추가 할 자격 증명 유형입니다. 다음과 같은 옵션을 사용할 수 있습니다.
None  자격 증명 유형이 적용되지 않습니다. 이로 인해 자격 증명이 저장되지 않을 수 있습니다.
Generic (일반적으로 Generic을 사용한다.) 특정 인증 패키지에서 사용하지 않는 일반 자격 증명입니다.
DomainPassword  Microsoft 인증 패키지 (NTLM, Kerberos, Negotiate)에 특정한 암호 자격 증명입니다.
DomainCertificate  Microsoft 인증 패키지 (Kerberos, Negotiate, Schannel)와 관련된 인증서 자격 증명입니다.
DomainVisiblePassword
Microsoft 인증 패키지 (여권)와 관련된 암호 자격 증명입니다.

 

PersistanceType : 주어진 자격 증명이 저장되는 규칙을 정의합니다. 다음과 같은 옵션을 사용할 수 있습니다.
Session  자격 증명은 현재 로그온 세션 동안 만 Windows 자격 증명 관리자에 저장됩니다. 동일한 사용자의 다른 로그온 세션에는 표시되지 않습니다. 이 사용자가 로그 오프했다가 다시 로그온 한 후에는 존재하지 않습니다.
LocalComputer  자격 증명은이 동일한 컴퓨터에서 모든 후속 로그온 세션에 대해 유지됩니다. 동일한 시스템에서이 동일한 사용자의 다른 로그온 세션에서는 볼 수 있지만 다른 시스템에서이 사용자의 로그온 세션에서는 볼 수 없습니다.
Enterprise 자격 증명은 동일한 컴퓨터에서 모든 후속 로그온 세션에 대해 유지됩니다. 동일한 컴퓨터에서 동일한 사용자의 다른 로그온 세션과 다른 컴퓨터에서이 사용자의 세션에 표시됩니다.

 

Add Credential 에서 지정해주는 세 개의 속성 Username, password, Target은

Window 자격 증명 관리에서 직접 추가해주는 credential 의 속성과 매칭된다!!!

그래서 add credential 안해주고 직접 credential을 만들어 줘도 되지만, Get 할때 속성을 똑같이 입력해야한다는것!!

요런 식으로 각 id, password, 인터넷 또는 네트워크주소(= Target) 값이 매칭이 된다!!

 

 

 

3. 세번째는 추가한 자격증명을 가져와주는 get secure Credential 액티비티이다.

Get secure credential 액티비티
Get secure Credential 액티비티 속성

 

이렇게 만들었던 속성값을 똑같이 주어서 데려온다!

그려면 최종적으로 오케스트레이터의 사용 없이 크리덴셜을 사용할 수 있다.

 

 

credential_practice.xaml
0.00MB

 

Caused by: java.lang.IllegalStateException: Not allowed to start service Intent : app is in background uid UidRecord{72d8d10 u0a147 TRNB idle procs:1 seq(0,0,0)}

 

환경 : 앱이 종료된 상태에서 이벤트를 실행

오류 원인 : Android O 버전 이상에서의 백그라운드 실행 거부

해결방안 : https://deje0ng.tistory.com/51

 

Static interface methods are only supported starting with Android N (--min-api 24): void butterknife.Unbinder.lambda$static$0()

 

환경 : Butterknife 사용

오류 원인 : Build(.app) 에 complie 옵션을 지정해주지 않음.

해결방안 : 

Build(.app) 의 android { } 안에 다음과 같이 명시

android {

	...

	// 아래와 같이 명시 !!
	compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    
}

 

 

java.util.concurrent.TimeoutException: Timed out waiting for Task




환경 : 전화가 온 상태에서 다이얼로그를 띄워야함


오류 원인 : 다이얼로그를 띄우는 과정에서 에러가 발생하여 다이얼로그를 결국 띄우지 못하고 앱이 죽음. 전화가 온 상태에서 다이얼로그를 띄우려고 한 것 이기 때문에 다이얼로그를 계속 호출함. 그런데 오류로 인해 띄우지 못하고 있으니, TimeoutException 예외가 발생함.



Microsoft .Net : TimeoutException 클래스

https://docs.microsoft.com/ko-kr/dotnet/api/system.timeoutexception?view=netcore-3.1

java.lang.NullPointerException: println needs a message



환경 : Log를 찍어보고 있는 상황.


오류원인 : Log에 찍겠다고 선언한 메세지가 null 값임.


해결방안 : 만약, 메세지가 null로 나와야하는 경우라면 null일때도 출력 가능하게끔 코드를 짠다거나, Log를 다른 방법으로 찍을 수 있도록 해야함. 하지만, 그런 경우가 아니라 null 값이 들어가는게 아니라 특정한 값이 나와야하는 경우라면, null 값이 찍힌 메세지구문을 디버깅해보고 구글링 해보면서 null 값이 나오는 이유를 알아야함.





java.lang.NullPointerException: Attempt to invoke interface method 'int java.lang.CharSequence.length()' on a null object



환경 : Broadcast receiver call, 전화가 왔을때 그 전화번호를 받아와 로그에 출력하는 과정

오류원인 : incomingNumber 변수에 null 값이 들어가서 "Log.d();"  구문에 오류가 발생.

해결방안 : null 값이 들어가는 이유를 알아보고, 해결해야함.


1. 에러 코드

String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);  // 여기서 값을 제대로 받아오지 못함.

String phone_number = PhoneNumberUtils.formatNumber(incomingNumber); // 그래서 phone_number 가 null 값이 되고,

Log.d("phone call : ", incomingNumber); // 결국 Log가 null값을 찍어야하기 때문에 오류가 발생하는것!!



2. 해결방안


null 값이 들어가는 이유는, manifest에 permission.READ_PHONE_STATE 권한이 있기 때문!!!

permission.READ_PHONE_STATE 라는 권한에 대해서 기존의 포스트에서도 두 번 수신된다는 언급이 있었는데,

나는 그걸 간과하고 두 번 수신되는 것에 대한 코드를 처리하지 않았음.

처음에 수신되면 incomingNumber에 값이 들어가는데, 두번째 수신이 될 때는 비워져서 들어가므로

최종적으로는 null 값이 반환되었던 것...!


따라서, 두 번 수신되는 것에 대한 코드 처리를 추가해줘야함.

(두 번 수신되는 이유에 대해서는 알 수 없음...)


또한, permission.READ_PHONE_STATE에 대한 권한 뿐만 아니라, permission.READ_CALL_LOG 권한에 대해서도 마찬가지임.

이 두개의 권한을 사용한다면, 꼭 수신에 관란 코드를 처리해야함.



3. 코드 수정

 public void onReceive(Context context, Intent intent) {

String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);


if (state.equals(mLastState)) { return; } else { mLastState = state; } // <- 요부분!!!

if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {

String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
String phone_number = PhoneNumberUtils.formatNumber(incomingNumber);
Log.d("phone call : ", incomingNumber);


}







수정합니다.



기존 코드 : 

public class IncomingCallBroadcastReceiver extends BroadcastReceiver {


    private static String mLastState;


    public void onReceive(Context context, Intent intent) {


        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);


        Log.d("state : ", state); // RINGING 반환


        if (state.equals(mLastState)) {

            return;

        } else {

            mLastState = state;

        }



        if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {


            String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

            String phone_number = PhoneNumberUtils.formatNumber(incomingNumber);


            Log.d("phone call : ", incomingNumber);


        }

    }




수정 코드 :


1) Manifest.xml


<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

<uses-permission android:name="android.permission.READ_CALL_LOG"/>



2) MainActivity.java


 public class MainActivity extends AppCompatActivity {


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED

                || ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SYSTEM_ALERT_WINDOW) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(MainActivity.this,

                    new String[]{Manifest.permission.READ_CALL_LOG, Manifest.permission.SYSTEM_ALERT_WINDOW},

                    1);

        }


    }

}



3) IncomingCallBroadcastReceiver.java


 public class IncomingCallBroadcastReceiver extends BroadcastReceiver {


    public void onReceive(Context context, Intent intent) {


        if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {

            String savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER");

        } else{

            String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);

            String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);

            int state = 0;


            if (stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)) {

                state = TelephonyManager.CALL_STATE_IDLE;

            } else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){

                state = TelephonyManager.CALL_STATE_OFFHOOK;

            } else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){

                state = TelephonyManager.CALL_STATE_RINGING;

            }


            if (number != null && !number.isEmpty() && !number.equals("null")) {

                //onCallStateChanged(context, state, number);

                Log.d("TEST :","NUMBER =>"+number);

            }

        }

    }


}





결론:

Manifest 추가 & MainAvtivity에서 permission을 허가받아야함 & 새로운 receiver 코드





 

jxl.read.biff.BiffException: Unable to recognize OLE stream

 

환경 : jxl 을 사용하여 엑셀 파일을 읽어와 리스트에 값을 출력함.

오류 원인 : Cuase 부분을 더 살펴본 결과 NullPointException이 있었음. 즉 파일이 잘 들어가지 않았다는 것. 파일 확장자를 보니 '.xlsx'로 되어 있었어서 인식이 안되었던 것. '.xls' 확장자만 허용. 바로 '.xls'로 바꿨는데도 실행이 안됐음. 그래서 엑셀 프로그램을 켜서 확장자를 '.xls'로 바꿔서 다른 이름으로 저장을 하면 데이터의 유실 없이 저장할 수 있기 때문에 그 다음부터 실행이 되었음. 즉 엑셀 파일에 문제가 있었던 것.

.xls-> 97~2003 엑셀 버전의 파일 확장자
.xlsx-> 최신 엑셀 버전의 파일 확장자

 

 

+ Recent posts