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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

1回答

520閲覧

wavファイルをファイル共有で他の再生アプリで開けるようにしたい

goodane

総合スコア21

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2022/05/08 04:07

編集2022/05/09 13:36

やりたいこと

wavファイルをファイル共有を行い、ミュージックなどの他の音楽再生アプリで、再生できるようにしたいです。

問題点

Intentを使い、他の再生アプリを開くことができたが、「曲を再生することができません」と表示され、wavファイルを再生することができない。

該当ソースコード

java

1public void onPlayOtherAPP(String fileName) { 2 Thread thread = new Thread(new Runnable() { 3 @Override 4 public void run() { 5 Intent intent = new Intent(Intent.ACTION_VIEW); 6 File file = new File(getContext().getFilesDir()+"/audio/"+fileName); 7 Uri uri = FileProvider.getUriForFile(getContext(), getContext().getApplicationContext().getPackageName()+".fileprovider", file); 8 intent.setDataAndType(uri, "audio/*"); 9 try{ 10 startActivity(intent); 11 }catch (Exception e){ 12 e.printStackTrace(); 13 } 14 } 15 }); 16 thread.start(); 17 }

マニフェストファイル

java

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.voicerecorder"> 4 <uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission-sdk-23> 5 <uses-permission-sdk-23 android:name="android.permission.RECORD_AUDIO"></uses-permission-sdk-23> 6 <application 7 android:name=".VoiceRecorderApplication" 8 android:allowBackup="true" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/Theme.VoiceRecorder"> 14 <activity 15 android:name=".MainActivity" 16 android:exported="true"> 17 <intent-filter> 18 <action android:name="android.intent.action.MAIN" /> 19 20 <category android:name="android.intent.category.LAUNCHER" /> 21 </intent-filter> 22 </activity> 23 <provider 24 android:name="androidx.core.content.FileProvider" 25 android:authorities="com.example.voicerecorder.fileprovider" 26 android:grantUriPermissions="true" 27 android:exported="false"> 28 <meta-data 29 android:name="android.support.FILE_PROVIDER_PATHS" 30 android:resource="@xml/filepaths" /> 31 </provider> 32 </application> 33 34</manifest>

filepaths.xml

java

1<?xml version="1.0" encoding="utf-8"?> 2<paths xmlns:android="http://schemas.android.com/apk/res/android"> 3 <files-path name="share" path="."/> 4</paths>

RecordFragment

java

1public class RecordFragment extends Fragment { 2 3 private Realm realm; 4 private MediaRecorder recorder; 5 private long startTime; 6 private long diff; 7 private final Handler handler = new Handler(Looper.getMainLooper()); 8 public boolean loop; 9 private TextView timerText; 10 private String fileName; 11 private enum STATE{ 12 initialize, 13 recording, 14 pause 15 } 16 private STATE state; 17 private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddkkmmss"); 18 private SimpleDateFormat playFormat = new SimpleDateFormat("mm:ss"); 19 View.OnClickListener buttonListener = new View.OnClickListener() { 20 @Override 21 public void onClick(View v) { 22 if(v == cancelButton){ 23 clearRecord(); 24 }else if(v == recordButton){ 25 startRecord(); 26 }else if(v == checkButton){ 27 stopRecord(); 28 } 29 } 30 }; 31 32 private ImageButton cancelButton; 33 private ImageButton recordButton; 34 private ImageButton checkButton; 35 @Nullable 36 @Override 37 38 public void onCreate(Bundle instance){ 39 super.onCreate(instance); 40 realm = Realm.getDefaultInstance(); 41 } 42 43 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 44 //fragmentのレイアウトを指定する 45 return inflater.inflate(R.layout.record_fragment_layout, null); 46 } 47 48 public void onViewCreated(View view, Bundle savedInstanceState){ 49 cancelButton = view.findViewById(R.id.cancelButton); 50 switchButton(cancelButton, View.GONE, false); 51 recordButton = view.findViewById(R.id.recordButton); 52 checkButton = view.findViewById(R.id.checkButton); 53 switchButton(checkButton, View.GONE, false); 54 cancelButton.setOnClickListener(buttonListener); 55 recordButton.setOnClickListener(buttonListener); 56 checkButton.setOnClickListener(buttonListener); 57 58 timerText = view.findViewById(R.id.recordTimeView); 59 recorder = new MediaRecorder(); 60 state = STATE.initialize; 61 } 62 63 @Override 64 public void onStart() { 65 super.onStart(); 66 } 67 68 public void onActivityCreated(Bundle savedInstanceState){ 69 super.onActivityCreated(savedInstanceState); 70 } 71 72 public void startRecord(){ 73 if(state == STATE.initialize) { 74 state = STATE.recording; 75 fileName = dateFormat.format(new Date()) + ".wav"; 76 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 77 recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 78 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 79 recorder.setOutputFile(getContext().getFilesDir() + "/audio/" + fileName); 80 try { 81 recorder.prepare(); 82 } catch (Exception e) { 83 e.printStackTrace(); 84 } 85 TimerThread thread = new TimerThread(); 86 thread.start(); 87 loop = true; 88 recorder.start(); 89 switchButton(recordButton, View.GONE, false); 90 switchButton(cancelButton, View.VISIBLE, true); 91 switchButton(checkButton, View.VISIBLE, true); 92 } 93 } 94 95 private void clearRecord(){ 96 recorder.stop(); 97 recorder.reset(); 98 loop = false; 99 state = STATE.initialize; 100 File file = new File(getContext().getFilesDir()+"/audio/"+fileName); 101 file.delete(); 102 if(!file.exists()){ 103 Log.i("File", "DELETE"); 104 } 105 switchButton(recordButton, View.VISIBLE, true); 106 switchButton(cancelButton, View.GONE, false); 107 switchButton(checkButton, View.GONE, false); 108 timerText.setText(playFormat.format(0)); 109 } 110 111 private void switchButton(ImageButton button, int visibility, boolean enabled){ 112 button.setVisibility(visibility); 113 button.setEnabled(enabled); 114 } 115 public void stopRecord(){ 116 if(state == STATE.initialize) return; 117 118 state = STATE.initialize; 119 recorder.stop(); 120 recorder.reset(); 121 loop = false; 122 123 File[] list = MainFragment.getCountFile(getContext().getFilesDir()+"/audio/"); 124 125 Bundle bundle = new Bundle(); 126 bundle.putString("fileName", fileName); 127 bundle.putLong("playTime", diff); 128 realm.executeTransactionAsync(new Realm.Transaction() { //データベースにデータを追加 129 @Override 130 public void execute(Realm realm) { 131 Number maxId = realm.where(AudioInfo.class).max("id"); //データがない場合、nullが帰ってくるので、nullに対応した処理を行う 132 int nextId = (maxId == null) ? 0 : maxId.intValue()+1; 133 AudioInfo info = realm.createObject(AudioInfo.class, nextId); //createObjectでデータを追加し、追加したデータのモデルを返す 134 //追加されたモデルのプロパティに値をセットする 135 info.setPlayingTime(diff); 136 info.setName(fileName); 137 info.setFileSize(10.0); 138 } 139 }); 140// 141// getParentFragmentManager().setFragmentResult("Record", bundle); 142 switchButton(recordButton, View.VISIBLE, true); 143 switchButton(cancelButton, View.GONE, false); 144 switchButton(checkButton, View.GONE, false); 145 } 146 147 148 149 150 public class TimerThread extends Thread{ 151 @Override 152 public void run() { 153 startTime = System.currentTimeMillis(); 154 while(loop){ 155 try{ 156 Thread.sleep(20); 157 }catch (InterruptedException e){ 158 e.printStackTrace(); 159 } 160 handler.post(new Runnable() { 161 @Override 162 public void run() { 163 diff = System.currentTimeMillis() - startTime; 164 timerText.setText(playFormat.format(diff)); 165 } 166 }); 167 } 168 handler.post(new Runnable() { 169 @Override 170 public void run() { 171 timerText.setText(playFormat.format(0)); 172 } 173 }); 174 } 175 } 176} 177

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

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

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

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

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

jimbe

2022/05/08 07:20

ファイルはファイルプロバイダに設定した共有用フォルダにあるのでしょうか。
goodane

2022/05/08 10:56

アプリの内部ストレージにaudioフォルダを作成して、そこにwavファイルを作成しています。 getFilesDir() + "/audio/ + ファイル名 という感じで保存しました。 ソースコードを記載しておきます。
jimbe

2022/05/09 02:35 編集

>アプリの内部ストレージにaudioフォルダを作成して そのフォルダが「ファイルプロバイダに設定した共有用フォルダ」でしょうか? ということです。filepaths.xml で指定してるパスとは違うのではないでしょうか。 また、実際にそのファイルが作成されていることや、 onPlayOtherAPP メソッド内で uri が該当ファイルを指しているかは確認されましたでしょうか。
guest

回答1

0

自己解決

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)を追加し、URIへの一時的な読み取りアクセス許可を与えることで、音声ファイルを他のアプリケーションと共有することができるようになりました。

投稿2022/05/09 04:36

goodane

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問