2013-09-30 4 views
0

파일을 SD에 씁니다. ASTRO 앱이나 Gmail 앱 또는 Yahoo 앱을 사용하고 있기 때문에 파일을 볼 수 있으며 앱에서 첨부 할 수도 있기 때문에 파일이 정상임을 압니다.하지만 앱에서 파일을 첨부하려고하면 그 파일이 상당히 다릅니다. Gmail이나 yahoo 앱을 선택하면 파일을 읽을 수 없습니다. 하지만 기본 앱을 선택하면 이메일 첨부 파일이 올바르게 전송됩니다.이메일 앱이 첨부하려는 파일을 읽을 수 없습니다.

여기 내 코드입니다. 감사!!

내부 AndroidManifest를 는 사용-권한 안드로이드 : 나는 그것을

String ruta = Environment.getExternalStorageDirectory().getPath() + "/Torno/Torno.xml"; 
Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.setType(getMimeType(ruta)); 
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(ruta)); 
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "el tema"); 
sendIntent.putExtra(Intent.EXTRA_TEXT, "el cuerpo del mensaje"); 

// Just trying 
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

startActivity(Intent.createChooser(sendIntent, "Title:"));` 
을 첨부하려고 이름 = "android.permission.WRITE_EXTERNAL_STORAGE"나는

File ruta_sd = Environment.getExternalStorageDirectory(); 
File f; 

// Creo la carpeta; 
File folder = new File(ruta_sd.getAbsolutePath() + "/Torno"); 
folder.mkdirs(); 

f = new File(ruta_sd.getAbsolutePath() + "/Torno/","Torno.xml"); 

// Just trying 
f.canRead(); 

OutputStreamWriter fout = new OutputStreamWriter(new FileOutputStream(f)); 
fout.write(c); <-- c is a String in xml format 

// Just trying 
fout.flush(); 

fout.close(); 

이제 파일을

을,

+0

"파일을 읽을 수 없습니다"란 무엇을 의미하는지 설명하십시오. 어떤 오류 메시지가 나타 납니까? 또한,'ContentProvider'를 사용하지 않을 때'FLAG_GRANT_READ_URI_PERMISSION'을 포함하는 이유는 무엇입니까? 'sync()'사용을 고려해 볼 수도 있습니다. http://android-developers.blogspot.com/2010/12/saving-data-safely.html – CommonsWare

+0

안녕하세요, 답변 해 주셔서 감사합니다. 나는 스페인 출신이고 메시지는 스페인어로되어 있습니다. 나는 그들을 번역하려고 노력할 것이다. Gmail 앱에서 "Se ha detenido la aplicación"은 "앱이 중지되었습니다"라는 의미입니다. 이것은 단추를 눌러 전송하지만 파일이 첨부 된 상태 일 때 발생합니다. 야후 응용 프로그램은 "읽기 권한이 없습니다."라는 의미는 "읽기 액세스가 거부되었습니다. 선택한 파일을 읽을 수 없습니다"입니다. FLAG_GRANT _....? 나는 단지 노력하고 있었다. sync()에 대한 링크를 읽습니다. 감사. – David

답변

1

아마도 경로에 문제가있을 수 있습니다.

String ruta = Environment.getExternalStorageDirectory().getPath() + "/Torno/Torno.xml"; 
... 
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(ruta)); 

에 : 변경

File ruta = new File(Environment.getExternalStorageDirectory(), "/Torno/Torno.xml"); 
... 
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(ruta)); 

하고 도움이되는지 확인 (FLAG_GRANT_READ_URI_PERMISSION 치우는와 함께, 아마도 sync() 시도).

0

결국 효과가있었습니다 !!! 나는 무슨 일이 일어나고 있는지 정말로 모른다. 응용 프로그램을 설치하지 않고 이클립스로 휴대 전화를 사용해 보았습니다. 예외의 e.getMessage()는 "/storage/sdcard/Torno/Torno.xml : open failed : ENOENT (해당 파일 또는 디렉토리 없음)"입니다.

마지막으로 앱을 설치하려고 생각하고 작동했습니다. 현재 코드 :

btnAceptar.setOnClickListener(new OnClickListener() { 

       @Override 
      public void onClick(View arg0) { 
        // TODO Auto-generated method stub 
        String contenido=""; 

        File fichero = null; 

        if (rdXML.isChecked()){ 
          contenido = creaFichero(1,Integer.parseInt("" + txtAno.getText()),Integer.parseInt("" + txtMes.getText())); 
          fichero = grabarFichero(contenido, "Torno.xml"); 
        } 
        else{ 
          contenido = creaFichero(2,Integer.parseInt("" + txtAno.getText()),Integer.parseInt("" + txtMes.getText())); 
          fichero = grabarFichero(contenido, "Torno.txt"); 
        } 

        if (fichero==null){ 
          Toast toast = Toast.makeText(getApplicationContext(),"No hay datos para ese mes !!", Toast.LENGTH_LONG); 
          toast.show(); 
        } 
        else{ 
         Intent sendIntent = new Intent(Intent.ACTION_SEND); 
         sendIntent.setType(getMimeType(fichero.getAbsolutePath())); 

         sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(fichero)); 
         sendIntent.putExtra(Intent.EXTRA_SUBJECT, "el tema"); 
         sendIntent.putExtra(Intent.EXTRA_TEXT, "el cuerpo del mensaje"); 
         startActivity(Intent.createChooser(sendIntent, "Title:")); 
        } 
      } 
    }); 

public static String getMimeType(String url){ 
    String type = null; 
    String extension = MimeTypeMap.getFileExtensionFromUrl(url); 
    if (extension != null) { 
     MimeTypeMap mime = MimeTypeMap.getSingleton(); 
     type = mime.getMimeTypeFromExtension(extension); 
    } 
    return type; 
} 

private File grabarFichero(String c,String n){ 

    File file = null; 

    try { 
     // Creo la carpeta; 
     File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Torno"); 
     folder.mkdirs(); 

     file = new File(Environment.getExternalStorageDirectory() + "/Torno", n); 
     OutputStreamWriter outw = new OutputStreamWriter(new FileOutputStream(file)); 
     outw.write(c); 
     outw.close(); 
    } 
    catch (Exception e) {} 

    return file; 
} 

고맙습니다 !!!

관련 문제