前提・実現したいこと
Androidのアプリを作成しています。
作成しているアプリに、以下の機能を実装しようとしています。
- ストレージに保存してあるdocxファイルを、他のアプリで開く(ここではMicrosoftのWordアプリとします)
- Wordでdocxファイルの内容を編集し、保存する
以下、使用している開発環境の情報です。
Android Studio 3.6.3 Build #AI-192.7142.36.36.6392135, built on April 14, 2020 Runtime version: 1.8.0_212-release-1586-b04 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o Windows 10 10.0 GC: ParNew, ConcurrentMarkSweep Memory: 1237M Cores: 8 Registry: ide.new.welcome.screen.force=true Non-Bundled Plugins: com.kaylerrenslow.plugin.armaplugin.id
開発言語にはJavaを使っています。
発生している問題
docxファイルを、他のアプリで開くことはできたのですが、
開いたファイルが読み取り専用になってしまって、Wordで編集できません。
「1回のみ」を選択↓
該当のソースコード
以下、現象を再現したソースコードです。
目標としては、docxファイルをユーザーに選択させますが、
以下のサンプルではdocxファイルをフルパスで指定しています。
java
1public class MainActivity extends AppCompatActivity { 2 Activity activity = this; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 Toolbar toolbar = findViewById(R.id.toolbar); 9 setSupportActionBar(toolbar); 10 11 FloatingActionButton fab = findViewById(R.id.fab); 12 fab.setOnClickListener(new View.OnClickListener() { 13 @Override 14 public void onClick(View view) { 15 // Wordファイルへのフルパス 16 String absolutePath = "/storage/0B22-05FF/work/sample.docx"; 17 File file = new File(absolutePath); 18 19 // URIを取得 20 Uri uri = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", file); 21 String mimeType = getMimeType(absolutePath); 22 Log.d("tekkamaki200yen", "mimeType=" + mimeType + ", uri=" + uri); 23 24 // インテントを生成して権限を付与 25 // Intent intent = new Intent(Intent.ACTION_VIEW); 26 Intent intent = new Intent(Intent.ACTION_EDIT); 27 intent.setDataAndType(uri, mimeType); 28 // intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 29 intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 30 31 // Officeファイルを開けるアプリを起動する 32 startActivity(intent); 33 } 34 }); 35 } 36 37 private String getMimeType(String path) { 38 String mimeType = "*/*"; 39 File file = new File(path); 40 String fn = file.getName(); 41 int ch = fn.lastIndexOf('.'); 42 String ext = (ch >= 0) ? fn.substring(ch + 1) : null; 43 if (ext != null) { 44 // 拡張子からMIMEType取得 45 mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext.toLowerCase()); 46 } 47 48 return mimeType; 49 } 50}
以下、実行時のログです。
log
1mimeType=application/vnd.openxmlformats-officedocument.wordprocessingml.document 2uri=content://com.xxx.intentsample01.provider/root/storage/0B22-05FF/work/sample.docx
試したこと
サンプルのソースコードに一通り含めてますが、個別に記載します。
(1) アクションの変更
Intentに設定するアクションを、当初「Intent.ACTION_VIEW」を指定していましたが、
「Intent.ACTION_EDIT」に変更しました。
java
1// Intent intent = new Intent(Intent.ACTION_VIEW); 2Intent intent = new Intent(Intent.ACTION_EDIT);
(2) 書き込み権限の設定
Intentに設定するフラグに、最初はreadだけ指定していたのを、writeも指定するように変更しました。
java
1// intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 2intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
上記2点を試しましたが、思ったとおりにはならず、読み取り専用で開かれてしまいました。
Wordで開いたファイルを、そのままWordで編集して保存させる為に、
どのような対処をすれば良いのかが分かりません。
解決方法をご存知の方がいれば、ご教授お願い致します。
補足情報
- AndroidManifest.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xxx.intentsample01"> 3 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 4 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 5 <application 6 android:allowBackup="true" 7 android:icon="@mipmap/ic_launcher" 8 android:label="@string/app_name" 9 android:roundIcon="@mipmap/ic_launcher_round" 10 android:supportsRtl="true" 11 android:theme="@style/AppTheme"> 12 <provider 13 android:name="androidx.core.content.FileProvider" 14 android:authorities="${applicationId}.provider" 15 android:exported="false" 16 android:grantUriPermissions="true"> 17 <meta-data 18 android:name="android.support.FILE_PROVIDER_PATHS" 19 android:resource="@xml/provider_paths"/> 20 </provider> 21 <activity 22 android:name=".MainActivity" 23 android:label="@string/app_name" 24 android:theme="@style/AppTheme.NoActionBar"> 25 <intent-filter> 26 <action android:name="android.intent.action.MAIN" /> 27 <category android:name="android.intent.category.LAUNCHER" /> 28 </intent-filter> 29 </activity> 30 </application> 31</manifest>
- res/xml/provider_paths.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<paths xmlns:android="http://schemas.android.com/apk/res/android"> 3 <root-path name="root" path="." /> 4 <files-path name="files" path="." /> 5 <cache-path name="cached_files" path="." /> 6 <external-path name="external_files" path="." /> 7 <external-cache-path name="cached_files" path="." /> 8 <external-files-path name="external_files" path="." /> 9</paths>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。