이 질문에는 몇 가지 하위 질문이 포함되어 있습니다. 나는 this question에 의해 시작, 이들을 포크입니다. 결국이 질문을 삭제하여 정리할 것입니다.FileProvider의 Hello World
다음 프로그램은 이론상 세계의 텍스트 파일을 공유합니다. 코드가 실행되지만 Dropbox 또는 Gmail에 공유하는 것은 실패합니다 (두 가지 구체적인 예를 통해). 이외에도 고해상도/값/strings.xml의에서 send_to
값을 추가하는
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String filename = "hellow.txt";
String fileContents = "Hello, World!\n";
byte[] bytes = fileContents.getBytes();
FileOutputStream fos = null;
try {
fos = this.openFileOutput(filename, MODE_PRIVATE);
fos.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
File file = new File(filename);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
shareIntent.setType("application/txt");
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
file.delete();
}
}
, 이클립스가 생성하는 일반 Hello, World
에게 한 변화의 유일한 쌍의 AndroidManifest.xml에 다음 <provider>
태그를 추가한다 :
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mycorp.helloworldtxtfileprovider.MainActivity"
android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_paths" />
</provider>
<activity
android:name="com.mycorp.helloworldtxtfileprovider.MainActivity"
...
... 그리고 입술에 다음을 추가/XML/my_paths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files" path="." />
</paths>
내 주요 질문은 전나무이다 st,하지만이 주제를 다룰 때 2-4의 질문에 대한 토론도 흥미로울 것입니다.
- 왜 위의 프로그램이 실패합니까?
- 사용자 정의
ContentProvider
이 필요한 경우 해당 클래스를 확장해야하지만 실제로는FileProvider
이 필요한 경우 파생없이 해당 클래스를 사용할 수 있습니까? - 이 코드에서는
openFileOutput
으로filename
을 두 번 한 번 사용하고new File()
을 사용해야했습니다. 이 중복을 피할 수있는 방법이 있습니까 (동일한 파일이 참조되는 것을 보장 할 수 있습니까?) startActivity(..)
이 호출 된 직후에 파일을 삭제하는 것이 안전합니까? 아니면 파일이 업로드/공유되었음을 알기 위해 콜백을 고안해야합니다. (실제 파일은/업로드를 공유 할 수있는 시간이 걸릴 수 있습니다.)
편집
코드는 잘 실행하고 보낼 수있는 응용 프로그램의 목록을 보여줍니다.
Dropbox를 선택하면 위치를 올바르게 선택할 수 있습니다. Dropbox는 "Dropbox에 업로드"와 "Upload failed : my_file.txt"라는 알림을 보냅니다.
Gmail을 선택하면받는 사람을 채울 수 있으며 파일이 첨부 된 것처럼 보이지만 "메시지 보내기"후에 "첨부 파일을 보낼 수 없습니다"라는 메시지가 나타납니다.
다른 사람들이 대답 할 시간이없는 질문은 삭제하고 삭제하지 않는 것이 좋습니다. 질문은 귀하의 이익을위한 것이 아니라 미래에 많은 사람들이 비슷한 것을 찾고있는 사람들을위한 것입니다. –
@BradLarson 한 질문/한 게시물 규칙을 위반하고 가격을 지불하고 있습니다. 그렇게함으로써 질문의 요점을 해결하지 않고 덜 중요한 문제에 합리적인 대답을함으로써 도움을 얻으려는 사람과 같은 친절한 영혼을 열어 놓았습니다 (1 부). 의견에서 언급했듯이 질문을 하위 파트로 나누고 있습니다. 나는 파트 1에 초점을 맞춘 질문을 시도했다. 아무도 대답을 모색하지 않았다. 나는 그것을 삭제하는 것을 선호했다. 궁극적으로 질문을 한 후 사용자가 비행 모드에있을 때 문제가 훨씬 더 복잡하다는 것을 깨달았습니다. TBC. – Calaf