2016-09-24 10 views
1

を書くとき、私は私のアプリのためのベースとして、このコードを使用しています:https://github.com/commonsguy/cw-omnibus/tree/master/MediaProjection/andcorderアンドロイドscreenrecorderクラッシュ外部ストレージに

は、今私は、出力ファイルのパスを変更しました。私は、外部のSDカードに保存したいのですが、私は録音を開始した場合、私はこのエラーを取得:

09-24 01:37:50.225 4428-4428/me.bleuzen.android.screenrecorder E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: me.bleuzen.android.screenrecorder, PID: 4428 
                      java.lang.RuntimeException: Unable to start service me.bleuzen.android.screenrecorder.R[email protected] with Intent { act=me.bleuzen.android.screenrecorder.RECORD flg=0x10000000 cmp=me.bleuzen.android.screenrecorder/.RecorderService bnds=[257,1321][832,1513] }: java.lang.RuntimeException: Exception preparing recorder 
                       at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3045) 
                       at android.app.ActivityThread.access$2200(ActivityThread.java:157) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5525) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
                       Caused by: java.lang.RuntimeException: Exception preparing recorder 
                       at me.bleuzen.android.screenrecorder.RecordingSession.start(RecordingSession.java:98) 
                       at me.bleuzen.android.screenrecorder.RecorderService.startRecorder(RecorderService.java:169) 
                       at me.bleuzen.android.screenrecorder.RecorderService.onStartCommand(RecorderService.java:76) 
                       at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3028) 
                       at android.app.ActivityThread.access$2200(ActivityThread.java:157)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:148)  
                       at android.app.ActivityThread.main(ActivityThread.java:5525)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)  
                       Caused by: java.io.FileNotFoundException: /storage/3E0D-1BF9/20160924_013750.mp4: open failed: EACCES (Permission denied) 
                       at libcore.io.IoBridge.open(IoBridge.java:452) 
                       at java.io.RandomAccessFile.<init>(RandomAccessFile.java:117) 
                       at java.io.RandomAccessFile.<init>(RandomAccessFile.java:149) 
                       at android.media.MediaRecorder.prepare(MediaRecorder.java:780) 
                       at me.bleuzen.android.screenrecorder.RecordingSession.start(RecordingSession.java:89) 
                       at me.bleuzen.android.screenrecorder.RecorderService.startRecorder(RecorderService.java:169)  
                       at me.bleuzen.android.screenrecorder.RecorderService.onStartCommand(RecorderService.java:76)  
                       at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3028)  
                       at android.app.ActivityThread.access$2200(ActivityThread.java:157)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:148)  
                       at android.app.ActivityThread.main(ActivityThread.java:5525)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)  
                       Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
                       at libcore.io.Posix.open(Native Method) 
                       at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
                       at libcore.io.IoBridge.open(IoBridge.java:438) 
                       at java.io.RandomAccessFile.<init>(RandomAccessFile.java:117)  
                       at java.io.RandomAccessFile.<init>(RandomAccessFile.java:149)  
                       at android.media.MediaRecorder.prepare(MediaRecorder.java:780)  
                       at me.bleuzen.android.screenrecorder.RecordingSession.start(RecordingSession.java:89)  
                       at me.bleuzen.android.screenrecorder.RecorderService.startRecorder(RecorderService.java:169)  
                       at me.bleuzen.android.screenrecorder.RecorderService.onStartCommand(RecorderService.java:76)  
                       at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3028)  
                       at android.app.ActivityThread.access$2200(ActivityThread.java:157)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:148)  
                       at android.app.ActivityThread.main(ActivityThread.java:5525)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)  

私のマニフェスト:私はすでにWRITE_EXTERNAL_STORAGE許可に入れ

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="me.bleuzen.android.screenrecorder"> 

<application 
    android:icon="@drawable/ic_videocam_white_24dp" 
    android:label="@string/app_name"> 
    <activity 
     android:name="me.bleuzen.android.screenrecorder.MainActivity" 
     android:theme="@style/AppTheme"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <service 
     android:name="me.bleuzen.android.screenrecorder.RecorderService" 
     android:exported="true" /> 
</application> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> 

。 WRITE_SETTINGSはショータッチを設定することです。

最も興味深いの行は次のようになります。java.io.FileNotFoundException:によって引き起こさ /storage/3E0D-1BF9/20160924_013750.mp4:EACCES(パーミッション拒否) 、/ストレージ/ 3E0D-1BF9 /:失敗を開きます私の外部のSDカードです。しかしなぜ「許可が拒否されましたか」? WRITE_EXTERNAL_STORAGEを追加しました。何か案が?

編集1:私は私のメイン/設定とだけの活動でのonCreateにこれを追加しました:

RecorderService.NOTIFY_IDはちょうどint型

であるとし、それを確認し

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.WRITE_SETTINGS, Manifest.permission.RECORD_AUDIO}, RecorderService.NOTIFY_ID); 

showToast(String.valueOf(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) + " " + 
       String.valueOf(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED) + " " + 
       String.valueOf(ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED)); 

static void showToast(String msg) { 
    Toast.makeText(appContext, msg, Toast.LENGTH_SHORT).show(); 
} 

出力は「true false true」

WRITE_SETTINGSはfalseのままです。 :( ...代わりにビデオを外部のSDカードに保存することができればOKです。おそらくWRITE_EXTERNAL_STORAGEは許可されていますが、問題は解決されていますが、それでも解決しません。理由を推測できる場合: 権限を要求するには、メソッドにアクティビティが必要です。これは、すべての活動が許可を要求しなければならないことを意味しますか?この問題は次のとおりです。レコーダーはサービスです。私は活動なしで許可を要求することはできません。

編集2:例: のAndroidManifest.xmlで:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="me.bleuzen.android.screenrecorder.MainActivity" 
    android:background="@android:color/background_light"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" 
     android:id="@+id/textView" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" /> 


    </RelativeLayout> 

MainActivity:このサンプルコードの

package me.bleuzen.android.screenrecorder; 

import android.Manifest; 
import android.app.Activity; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.widget.TextView; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 

public class MainActivity extends Activity { 

    private TextView textView; 

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

     textView = (TextView) findViewById(R.id.textView); 

     boolean canWrite = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; 

     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
     textView.append("WRITE_EXTERNAL_STORAGE: " + canWrite + "\n"); 

     if(canWrite) { 
      textView.append("Befor: " + new File("/storage/emulated/0/z.txt").exists() + " " + new File("/storage/6301-17FC/z.txt").exists() + "\n"); 

      writeToFile("Unglaublich wichtig", "/storage/emulated/0/z.txt"); 
      writeToFile("Unglaublich wichtig", "/storage/6301-17FC/z.txt"); 

      textView.append("After: " + new File("/storage/emulated/0/z.txt").exists() + " " + new File("/storage/6301-17FC/z.txt").exists() + "\n"); 
     } else { 
      textView.append("Please restart this app after granting permission."); 
     } 
    } 

    private static void writeToFile(String s, String f) { 
     File file = new File(f); 
     try { 
      file.createNewFile(); 
      FileOutputStream outputStream = new FileOutputStream(file); 
      OutputStreamWriter writer = new OutputStreamWriter(outputStream); 
      writer.append(s); 
      writer.close(); 
      outputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

結果: オン/ storage/emulated/0(内部)ファイルが作成され、/ stに作成されますorage/6301-17FC(私の外部のSDカード)ではありません。

編集3:6391-A617は、私の外付けSDカードである

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if(grantResults[0]== PackageManager.PERMISSION_GRANTED){ 
     try { 
      new File("/storage/6391-A617/test").createNewFile(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

、(今回もう一つは、テストする):私はこれをしようと試みました。 結果:

あなたは、Android 6.0でアプリを実行しているので
09-27 15:39:16.624 4965-4965/me.bleuzen.android.screenrecorder W/System.err: java.io.IOException: open failed: EACCES (Permission denied) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at java.io.File.createNewFile(File.java:939) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at me.bleuzen.android.screenrecorder.MainActivity.onRequestPermissionsResult(MainActivity.java:226) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6588) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at android.app.Activity.dispatchActivityResult(Activity.java:6467) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at android.app.ActivityThread.deliverResults(ActivityThread.java:3738) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3785) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at android.app.ActivityThread.access$1400(ActivityThread.java:157) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at android.os.Looper.loop(Looper.java:148) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5525) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620) 
09-27 15:39:16.633 4965-4965/me.bleuzen.android.screenrecorder W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
09-27 15:39:16.634 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at libcore.io.Posix.open(Native Method) 
09-27 15:39:16.634 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
09-27 15:39:16.634 4965-4965/me.bleuzen.android.screenrecorder W/System.err:  at java.io.File.createNewFile(File.java:932) 
09-27 15:39:16.634 4965-4965/me.bleuzen.android.screenrecorder W/System.err: ... 13 more 
+0

ランタイム権限を実装し、直接ここに関連するコードを投稿してくださいを始めるいくつかのリンクです。 RecordingSession.javaの98行目を含めてください。 –

+0

あなたのマニフェストに 'WRITE_EXTERNAL_STORAGE'を追加してよかったです。ランタイム許可を実装しましたか?どのOSバージョンでデバイスが実行されていますか? –

+0

@SrikarReddy私のテストデバイス:LG G4(Android 6.0) 実行時のアクセス許可を実装した場合は、あなたは、アプリケーションの実行中にユーザに許可を求めることを意味しますか?はいの場合、私はこれをまだ実装する方法を知らない。 – Bleuzen

答えて

2

、ランタイム許可を実装するWRITE_EXTERNAL_STORAGEには必須です。これがクラッシュの背後にある理由です。ここで

あなたはhttps://developer.android.com/training/permissions/index.html https://github.com/googlesamples/android-RuntimePermissions http://www.androidwarriors.com/2016/05/runtime-permissions-android-m-example.html

+0

コメントには長すぎます:http://pastebin.com/KZzUMM22 コードのRecorderService.NOTIFY_IDは単なるintです。 – Bleuzen

+0

@Bleuzenコメントが長すぎる場合は、代わりに元の質問を編集する必要があります。 –

+0

@ Code-Apprentice Question edited;) – Bleuzen

関連する問題