2017-09-10 11 views
1

現在、min sdkが19のアンドロイドアプリを開発していて、26歳までサポートしています。今週はアクティビティにカメラ機能を追加しました。これをデバッグするのはばかげて挑戦的なことです。API 22カメラ別インテントの問題

基本的に、ユーザーはカメラアイコンをクリックし、意図を介してアンドロイドカメラを起動し、ユーザーが写真を撮って保存し、カメラの意図を開始する前に見ていたスライダーギャラリーに追加します。

最終的にAPI 19,21,23,24,25、および26で作業していました...問題を引き起こしている唯一のAPIは22であり、なぜその理由が分かりません。カメラのアイコンをクリックすると、インテントが起動し、カメラが白い画面に読み込まれ、アプリがクラッシュします。キッカーはこれです、私はちょうどそれを試したと働いた、アプリは正常に写真を撮って、それを保存し、クラッシュしていないことを2回thats。それが働いた後

は、私は再びそれを試してみましたが、私はこれだ:

9月9日17:19:22.381 6163から6163/com.android.cameraのE /カメラ:エラー100 09から09を17:19:22.381 6163-6163/com.android.camera E/CameraErrorCallback:Got>カメラエラーコールバック。誤差= 100 9月9日17:19:22.381 6163から6163/com.android.camera E/AndroidRuntime:FATAL> EXCEPTION:メイン プロセス:> com.android.camera、PID:6163

ジャワ.lang.RuntimeException:メディアサーバーが停止しました。 at> com.android.camera.CameraErrorCallback.onError(CameraErrorCallback.java:31) at> android.hardware.Camera $ EventHandler.handleMessage(Camera.java:1148) at> android.os.Handler.dispatchMessage(Handler .java:102) に> android.os.Looper.loop(Looper.java:135) に> android.app.ActivityThread.main(ActivityThread.java:5254) に> java.lang.reflect.Method。 invoke(ネイティブメソッド) at> java.lang.reflect.Method.invoke(Method.java:372) at> com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903) at> com.android.internal.os.ZygoteInit.main(Zy goteInit.java:698)

そして、それを試した後少し後、私は、まだ再び別のエラーを得た。..

9月9日17:32:22.185 1530年から1611年/ system_processをE/AudioService:メディアサーバーが停止しました。 9月9日17:32:22.191 4072から4072/com.android.camera E/AndroidRuntime:FATAL> EXCEPTION:メイン プロセス:> com.android.camera、PID:4072

れるjava.lang。 RuntimeException:getParametersが失敗しました(空のパラメータ)。 at> android.hardware.Camera.native_getParameters(ネイティブメソッド) at> android.hardware.Camera.getParameters(Camera.java:1888) > com.android.camera.Camera initializeZoom(Camera.java:489) at> com.android.camera.Camera.initializeFirstTime(Camera.java:392) > com.android.camera.Camera.access $ 600 (Camera.java:87) at> com.android.camera.Camera $ MainHandler.handleMessage(Camera.java:290) > android.os.Handler。>れるjava.lang.reflectで> android.app.ActivityThread.main(ActivityThread.java:5254) で> android.os.Looper.loop(Looper.java:135) でDispatchMessageを(Handler.java:102) .Method.invoke(ネイティブメソッド) at java.lang.reflect.Method.invoke(Method.java:372) at> com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)ここでcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

>で は私のコードは、カメラ機能/ ACTIを呼び出すを中心ですVITY:

は、カメラアイコンのonclickリスナーの設定:結果のための活動に

public boolean onCreateOptionsMenu(Menu menu) { 

     item.getActionView().setOnClickListener(new View.OnClickListener() > 
      @Override 
      public void onClick(View v) { 
       startActivityForResult(CameraUtility.dispatchTakePictureIntent(getApplicationContext(), mushroomFolder), 1); 
       return; 
      } 
     }); 
    return super.onCreateOptionsMenu(menu); 
} 

ちょうどギャラリーへの最後の撮影した写真を追加し、たとえそうであっても、私はそれを含めわざわざ習慣に達していません。

そしてHERESに私のCameraUtilityのためのコード:

class CameraUtility extends AppCompatActivity { 
private static String CURRENT_PHOTO_PATH; 
public static String PHOTO_DIRECTORY; 

public static void setPhotoDirectory(Context c) { 
    PHOTO_DIRECTORY = c.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/MyTrackerPhotos/"; 
} 

public static Intent dispatchTakePictureIntent(Context c, String name) { 
    String timeStamp = new SimpleDateFormat("dd-MM-yyyy_HHmmss").format(new Date()); 
    String path = c.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/MyTrackerPhotos/" + name + "/" + name + timeStamp + ".jpg"; 
    File file = new File(path); 
    Uri outputFileUri; 
    if (Build.VERSION.SDK_INT >= 23)   
     outputFileUri=FileProvider.getUriForFile(c, 
     "com.tracker.mushroom.fileprovider", file); 
    else 
     outputFileUri = Uri.fromFile(file); 
    CURRENT_PHOTO_PATH = file.getPath(); 
    Intent intent = new Intent(
      MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
    return intent; 
} 

public static String getCurrentPhotoPath() { 
    return CURRENT_PHOTO_PATH; 
} 

public static File[] getImageFiles(Context c, String mushroomFolder) throws IOException { 
    String filePath = c.getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/MyTrackerPhotos/" + mushroomFolder; 
    File file = new File(filePath); 
    file.mkdirs(); 
    file.setReadable(true); 
    file.setWritable(true); 
    return file.listFiles(); 
    } 
} 

だから私は私のコードのその発行した場合、またはそのエミュレータの場合や、他の何かが私もわからない場合は本当にわからないんだけどなぜなら、他のすべてのAPIが動作していれば、私は助けられることはありませんが、私の頭を傷つけてしまうからです。私はgetParameters()エラーがカメラクラスに関連していることを知っていますが、私はそれを使用していないので、なぜそのエラーを引き起こすのか分かりません。すべての入力はすべて歓迎され、非常に感謝しています。

+0

これはAPI関連の問題ではなく、クラッシュするよう呼びかけるのはカメラアプリです。あなたはAPI 22エミュレータでこれを試していますか? – ianhanniballake

+0

実際のデバイスで作業する場合、単にデバイス固有の問題である可能性があります。私は奇妙なカメラの問題を抱えていたかなりのデバイスに遭遇しました。さらに、そのデバイスのデフォルトのカメラアプリにも問題がある可能性があります。所有者は、システムカメラアプリの代わりに、カメラインテントがそれらを処理するためのサポートを明示する任意のアプリを設定することができます。さらに、システムカメラアプリでさえ、あまり研磨されていないデバイスではバグがあるかもしれません。 –

+0

@ianhanniballakeはい、api 22エミュレータ、別の携帯電話。エミュレータで提供されているデフォルトのカメラアプリに問題があるとお考えですか?それは多くの意味があるからです。 – Philtron

答えて

1

もう少しテストをしましたが、エミュレータ/アンドロイドスタジオでこれを責めるつもりです。私は3つのfirebase roboテストを実行しました。すべてapi 22とさまざまな電話機モデルで実行されました。

これらの各1つは、カメラの動作を継続して開いたり閉じたりしていますが、残念ながら実際にはテストは行われませんでしたが、その前にクラッシュが発生していました。

API 22を搭載した物理的なデバイスで自分自身をテストしてうまくいくとすれば、そのエミュレータ/アンドロイドの問題を確認できます。この時点では、特にロボテストの後でこれを試してデバッグする時間を投資する価値があると感じていません。誰かがこの便利なことを発見し、いくつかの変異ゴーストエラー、笑を追いかけて時間を節約したいと願っています。

EDIT: 最後のメモとして追加したいと思います。私はapi 22 x86をダウンロードしてインストールし、新しいエミュレータを作成しました。もう問題はない。私はapi 22 x86_64を使用していましたが、なんらかの理由でそのバージョンで動作したくないのです。コメントした人たちへの感謝、あなたたちはかなり激しかったです。

関連する問題