質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

1464閲覧

AndroidアプリからWordファイルを他のアプリで開き、編集・保存させたい

tekkamaki200yen

総合スコア0

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/05/20 15:20

前提・実現したいこと

Androidのアプリを作成しています。
作成しているアプリに、以下の機能を実装しようとしています。

  1. ストレージに保存してあるdocxファイルを、他のアプリで開く(ここではMicrosoftのWordアプリとします)
  2. 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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決したので方法を記載します。
provider_paths.xml の内容を修正することで、
Wordファイルを、他のアプリに書き込み可能な状態で開かせることが出来ました。
以下のように修正しました。

  • 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="file" 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>

root-pathname を、
"root" から "file" に変更しました。

投稿2020/10/03 12:15

tekkamaki200yen

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

複数のアプリからファイルを開くと、書き込むことができるのは一つだけとなりますが、そういうことかな?

それであるなら、どうしようもないように思いますが

投稿2020/05/20 22:03

編集2020/05/20 22:04
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tekkamaki200yen

2020/05/21 09:59

解答ありがとうございます。 FileWriter/FileReaderやストリームを使ってファイルを開いていないので、 サンプルのコードを実行することで、ファイル自体が読み取り専用になるわけではないようです。 試しに、File file = new File(absolutePath); を onCreate で行った状態のままで、 対象のdocxファイルをWordで開いてみましたが、書き込み可能でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問