14

このコードは以前は機能していましたが、Android4.2とOpenCV2.4.4では失敗しますが、理由はわかりません。誰かが私のためにそれに光を当てることができますか?

助けてくれてありがとう。

バズ

public void SaveImage (Mat mat) {
  Mat mIntermediateMat = new Mat();

  Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3);

  File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
  String filename = "barry.png";
  File file = new File(path, filename);

  Boolean bool = null;
  filename = file.toString();
  bool = Highgui.imwrite(filename, mIntermediateMat);

  if (bool == true)
    Log.d(TAG, "SUCCESS writing image to external storage");
  else
    Log.d(TAG, "Fail writing image to external storage");
  }

boolは毎回falseに戻ります。ファイルのパス/名前は、ユーザー#0のファイルパス/名前( "storage / emulated / 0 / Pictures / barry.png")であり、ディレクトリPicturesがあります。

imwriteがfalseを返す原因は何ですか?

マットをbmpに変換して自分で保存することもできますが(OpenCV以外のアプリの他の場所で行います)、Highgui.imwriteが存在するため、このコードは2.4.0に書き込んでAndroidでテストするときに機能していました。 3.x、できれば使いたいです。

どうもありがとう

バズ

4

4 に答える 4

19

信じられない。[facepalm]。

これをマニフェストファイルBarryに追加します。

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

誰かが来て私を叩いてくれませんか?マニフェストから書き込み許可を削除することができたので、実際には書き込みが行われないことに驚くことはありません...

ドー。

バリー

于 2013-03-14T11:13:01.180 に答える
5

実際には2つの考えられる問題があります。

  1. Androidの権限。この問題を修正するには、マニフェストに権限を追加します

    "android.permission.WRITE_EXTERNAL_STORAGE"

  2. ファイルをSDカードに保存しようとしていますが、デバイスが「ディスクドライブ」モードでPCに接続されています。これは、アクセス権をPCと共有することを意味します。デバイスを「充電のみ」モードで接続します。接続モードを確認するには、

    Environment.getExternalStorageState() 、 「ディスクモード」の場合は共有に戻り、「充電のみ」の場合はマウントされます。

    コードを変更しましたが、次のようになります

    public void SaveImage (Mat mat) {
       Mat mIntermediateMat = new Mat();
       Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3);
    
       File path = new File(Environment.getExternalStorageDirectory() + "/Images/");
       path.mkdirs();
       File file = new File(path, "image.png");
    
       filename = file.toString();
       Boolean bool = Highgui.imwrite(filename, mIntermediateMat);
    
       if (bool)
        Log.i(TAG, "SUCCESS writing image to external storage");
       else
        Log.i(TAG, "Fail writing image to external storage");
    }
    
于 2013-06-11T12:33:37.907 に答える
0

android.permission.WRITE_EXTERNAL_STORAGE外部SDカードへの書き込みが許可されていないため、バージョン+4.4(KitKat)に注意してください。

WRITE_EXTERNAL_STORAGE権限は、デバイスのプライマリ外部ストレージへの書き込みアクセスのみを許可する必要があります。合成された権限で許可されているパッケージ固有のディレクトリを除き、アプリにセカンダリ外部ストレージデバイスへの書き込みを許可してはなりません。この方法で書き込みを制限すると、アプリケーションがアンインストールされたときにシステムがファイルをクリーンアップできるようになります。

見てください:SDカードへの書き込みは常に失敗します

于 2016-05-10T14:19:54.970 に答える
0

Android6以降から

Android 6.0(APIレベル23)以降、ユーザーはアプリのインストール時ではなく、アプリの実行中にアプリに権限を付与します...

そして、次のようなものを追加する必要があります。

  if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
  {
        ActivityCompat.requestPermissions(
                this,
                new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
                PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
  }

https://developer.android.com/training/permissions/requesting.html

于 2017-11-02T14:34:28.547 に答える