내 클래스의 SD 카드에 쓰고 있는데 성공적으로 할 수 있으며 MediaScannerConnection과 OnScanCompletedListener도 설정할 수 있습니다. 그 모든 작동하지만 내가 OnScanCompleteListener에서 스캔이 완료되었습니다 사용자에게 경고하기 위해 축배를 넣을 때 LogCat에서 많은 오류가 발생하고 토스트가 나타나지 않지만 파일은 여전히 SD 카드에 저장됩니다.토스터 때문에 OnScanCompletedListener가 깨졌습니다.
어떻게 해결할 수 있습니까?
아래더 자세히 ..
InputStream is = getResources().openRawResource(R.drawable.greenball);
OutputStream os = new FileOutputStream(file);
byte[] data = new byte[is.available()];
is.read(data);
os.write(data);
is.close();
os.close();
OnScanCompletedListener, 단지 내부의 토스트와 함께 작동하지 않습니다 (완벽하게 작동) SD 카드에 쓰기? 아직 SD 카드에 파일을 저장하지만 Logcat과 OnstanCompleteListener가 표시되지 않는 토스트에서 많은 오류가 발생합니다. 토스트없이 시도 했으므로 작동해야합니다.
MediaScannerConnection.scanFile(ExternalData.this,
new String[] {file.toString()},
null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
// TODO Auto-generated method stub
Toast t = Toast.makeText(ExternalData.this, "scan complete", Toast.LENGTH_SHORT);
t.show();
}
});
어떤 도움을 내가 주위를 검색 한 그냥 캔트이 아무것도 찾을 좋은 것
02-11 15:34:39.896: E/JavaBinder(11134): java.lang.RuntimeException: Can't create
handler inside thread that has not called Looper.prepare()
02-11 15:34:39.896: E/JavaBinder(11134): at android.os.Handler.<init>
(Handler.java:121)
02-11 15:34:39.896: E/JavaBinder(11134): at
android.widget.Toast.makeText(Toast.java:231)
로그 고양이 오류의 일부. 내가 만든 간단한 오류가 있다면 고맙습니다. 잘못된 스레드에서
IMPORTS...
public class ExternalData extends Activity implements OnClickListener,
OnItemSelectedListener {
TextView canWrite, canRead;
String state;
boolean canW, canR;
Spinner spinner;
String[] paths = { "Music", "Pictures", "Download" };
File path = null;
File file = null;
EditText saveFile;
Button confirm, save;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.externaldata);
canWrite = (TextView) findViewById(R.id.tvCanWrite);
canRead = (TextView) findViewById(R.id.tvCanRead);
confirm = (Button) findViewById(R.id.bConfirmSaveAs);
save = (Button) findViewById(R.id.bSaveFile);
saveFile = (EditText) findViewById(R.id.etSaveAs);
confirm.setOnClickListener(this);
save.setOnClickListener(this);
checkState();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(ExternalData.this, android.R.layout.simple_spinner_item, paths);
spinner = (Spinner) findViewById(R.id.spinner1);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
private void checkState() {
// TODO Auto-generated method stub
state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
// read and write
canWrite.setText("true");
canRead.setText("true");
canW = canR = true;
} else if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
// read but can't write
canWrite.setText("false");
canRead.setText("true");
canW = false;
canR = true;
} else {
canWrite.setText("false");
canRead.setText("false");
canW = canR = false;
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()){
case R.id.bSaveFile:
String f = saveFile.getText().toString();
file = new File(path, f + "png");
checkState();
if (canW == canR == true){
path.mkdir();
try {
InputStream is =
getResources().openRawResource(R.drawable.greenball);
OutputStream os = new FileOutputStream(file);
byte[] data = new byte[is.available()];
is.read(data);
os.write(data);
is.close();
os.close();
Toast t = Toast.makeText(ExternalData.this, "File has been Saved", Toast.LENGTH_LONG);
t.show();
//Update files for the user to use
MediaScannerConnection.scanFile(ExternalData.this,
new String[] {file.toString()},
null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
// TODO Auto-generated method stub
Toast t = Toast.makeText(ExternalData.this, "Scan Complete", Toast.LENGTH_SHORT);
t.show();
}
});
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case R.id.bConfirmSaveAs:
save.setVisibility(View.VISIBLE);
break;
}
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
int position = spinner.getSelectedItemPosition();
switch (position){
case 0:
path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
break;
case 1:
path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
break;
case 2:
path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
, 내가 한 모든 토스트 변수는 글로벌 만들어 단지에 만들기로 한 번에 초기화됩니다 나는 안드로이드 아주 새로운 해요 이후 그 완전히 무슨 뜻인지 모르겠지만, 문제를 해결했습니다 메서드를 호출 한 다음 OnScanCompleteListener가 축배를 표시하면됩니다. 이게 괜찮은 해결책이라고 생각하세요? –