리스트 액티비티가 파일 목록을 보여주는데 거기서 저는 암호화된 파일을 리스트에서 클릭할 때,복호화를 하려고 해요.
리스트 액티비티에서 오버라이드된 메소드 onListItemClick(ListView lv, View v,int position, long id) 내에
암호화된 파일 조건을 붙인뒤 입력 다이얼로그를 만들고 입력 다이얼로그 버튼 처리를 하려고 하는데 문제는
public void onClick(DialogInterface dialog, int which) 내에 복호화 함수(decryption)를 호출하려고 하는데 복호화 함수의 인자인 int position(리스트에 있던 파일의 위치)부분에서 문제가 생겼어요.
에러 내용은 'Cannot refer to a non-final variable position inside an inner class defined in a different method'라고 나와요.
그래서 고치는 방법은 onListItemClick(ListView lv, View v,int position, long id) 의 인자 중 int position을 final int position으로 하라고 하네요.
final은 변하지 않은 상수를 정의하는건데 그러면 리스트에서의 파일 관련 관리가 안되잖아요.
onListItemClick(ListView lv, View v,int position, long id) 의 인자 중 int position을 final로 바꾸기도 그렇고
복호화 처리 함수는 입력 후 버튼 클릭시 수행되어야 하는데 onClick 바깥에 두면 복호화 수행이 안되거든요.
이 부분만 처리가 잘 되면 거의 다 끝나는데 여러분들의 조언이 필요합니다.ㅜㅜ
public boolean isEncrypt(File paramFile)
{
return true;
}
public void onListItemClick(ListView lv, View v,int position, long id)
{
//선택된 파일이 암호 파일일때
if(isEncrypt(checkFile))
{
final LinearLayout linear = (LinearLayout)View.inflate(OpenList.this, R.layout.keydialog2, null);
AlertDialog.Builder input = new AlertDialog.Builder(OpenList.this);
input.setTitle("Notification");
input.setView(linear);
input.setMessage("Input your Key");
input.setPositiveButton("OK", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
mUserText = (EditText)linear.findViewById(R.id.trueyourKey);
SharedPreferences prefs = getSharedPreferences("KEY",MODE_PRIVATE);
prefs = getSharedPreferences("KEY",MODE_PRIVATE);
inputPassword = mUserText.getText().toString();
if(inputPassword.equals(prefs.getString("PASSWORD", Edit.checkPass)))
{
keyPass = stringToByte(inputPassword);
initKey(keyPass);
decryption(position); //문제점이 되는 부분
}
else if(inputPassword.equalsIgnoreCase(prefs.getString("PASSWORD", Edit.checkPass)))
{
Intent warn_i = new Intent(OpenList.this,Message.class);
startActivity(warn_i);
}
else if(inputPassword==" ")
{
Intent warn_input = new Intent(OpenList.this,Message.class);
startActivity(warn_input);
}
}
}).show();
}
//암호파일이 아닐때
else
{
setReadFile(position);
Intent intent = new Intent(OpenList.this, Read.class);
intent.putExtra("NAME", sReadFile[FILENAME]);
intent.putExtra("CONTENT", sReadFile[FILECONTENT]);
startActivityForResult(intent, 1);
}
}
//encrypted File-> 인자는 리스트에서 선택되어지는 파일의 위치
public void decryption(int pos)
{
sReadFile[FILENAME] = mFileList[pos].replace(".encrypted", "");
byte[] cipherText = new byte[136];
byte[] plainText = new byte[128];
int outputTextLen=0;
try{
HIGHT hight = new HIGHT();
hight.init(HIGHT.DEC, key, iv);
FileInputStream fis = openFileInput(mFileList[pos]);
fis.read(cipherText, 0, fis.available());
outputTextLen = hight.process(cipherText, cipherText.length, plainText, 0);
hight.close(plainText, outputTextLen);
fis.read(plainText,0,fis.available());
sReadFile[FILECONTENT] = byteToString(plainText);
fis.close();
}catch(Exception e){
e.printStackTrace();
}
Intent intent_r = new Intent(OpenList.this,Read.class);
intent_r.putExtra("NAME", sReadFile[FILENAME]);
intent_r.putExtra("CONTENT",sReadFile[FILECONTENT]);
startActivityForResult(intent_r, 1);
}




전역변수하나 두시거나 내부에 final 하나 두셔서 포지션을 거기다 넣고 그 변수를 디크립트에 넣으시면 될거같으네요.