2017-01-04 3 views
0

Как отправить файл csv?Как отправить файл csv?

У меня есть приложение для Android, которое создает файл csv. И я хочу поделиться им: отправить по электронной почте, открыть в Excel и так далее. Я читал учебники: set up file sharing и sharing a file, но не могу понять: это для моего варианта или нет?

объявляю манифест:

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="com.nam1.name2.fileprovider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/filepaths" /> 
    </provider> 

Но что я должен делать дальше?

Можете ли вы рассказать мне пример простого кода (возможно, git-repo), как обмениваться файлами с другими приложениями? Спасибо!

EDIT: я пишу какой-то новый код для обмена файлами (смотрите на FileProvider примере)

public class ExportActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_export); 

    Intent intentShareFile = new Intent(Intent.ACTION_SEND); 
    intentShareFile.setAction(Intent.ACTION_SEND);   
    File imagePath = new File(getApplicationContext().getFilesDir(), "statistics"); 
    File newFile = new File(imagePath, "stat.csv"); 
    CSVHelper csvHelper = new CSVHelper(SharedData.AllPlayersColl); 
    try { 
     String path=imagePath.getAbsolutePath(); 
     csvHelper.SaveToCSV(path); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    Context context=getApplicationContext(); 
    Uri contentUri = getUriForFile(context, "com.name1.name2.fileprovider", newFile); 

    List<ResolveInfo> resInfoList = getApplicationContext().getPackageManager() 
      .queryIntentActivities(intentShareFile, PackageManager.MATCH_DEFAULT_ONLY); 
    for (ResolveInfo resolveInfo : resInfoList) { 
     String packageName = resolveInfo.activityInfo.packageName; 
     getApplicationContext() 
       .grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    } 

    intentShareFile.setData(contentUri); 
    intentShareFile.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    setResult(100, intentShareFile); 
    startActivityForResult(intentShareFile,100); 
    } 
} 

Где CSVHelper является:

fun SaveToCSV(fileName: String?) { 
    if (fileName == null) 
     throw NullPointerException("fileName is null!") 

    val writer = CSVWriter(FileWriter(fileName), '\t') 

     // make csv file 
     writer.writeNext(firstLine); 
    } 

И filepaths является:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
<paths> 
    <files-path name="stat" path="statistics/" /> 
</paths> 

Но, я получаю сообщение об ошибке:

  Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.SEND dat=content://com.name1.name2.fileprovider/stat/stat.csv flg=0x2 } 

Я хочу, чтобы, когда я начать Intent список вариантов шоу (на андроид устройства): email_app, excel_app и так далее. Итак, я хочу отправить noname намерение.

+0

Вы начали с FileProvider, который хорош, но необходим только в особых обстоятельствах. Вы лучше Google для кода, используя 'Intent.ACTION_SEND' и' Intent.ACTION_VIEW', как это то, что вы должны реализовать. – greenapps

ответ

1

FileProvider вспомогательный класс предназначен для совместного использования файлов в качестве content:// URIs вместо file:// URIs, которые были устаревшими в течение некоторого времени и запрещено, поскольку уровень API 24.

Вы объявили контент-провайдера, вам нужно сейчас, чтобы настроить это, то есть выбрать, какой файл он может обслуживать. Это делается в файле xml/filepath, который вы указали в метаданных. Затем вы сможете создавать общие URL-адреса контента, используя FileProvider.getUriForFile().

Существует полный wrap up

К сожалению, не все приложения понимают content:// URI. Если вам нужно поделиться файлом с (очень старым или плохо написанным) приложением, которое обрабатывает только file:// URI, вы все равно можете использовать их, если вы установили целевой уровень вашего приложения на 23 или ниже.

+0

Нет, мне не нужно делиться старыми приложениями –

+0

i edit question –

Смежные вопросы