1

ユーザーが写真を撮ることができ、その写真がイメージビューに保存されるアプリを作成しようとしています。これを機能させるために、何十もの方法を試しました。

私が見た多くの回答は、MediaStore インテントを使用して ACTION_CAMERA_CAPTURE を渡すことで data.getExtra("data") を使用することを提案しています。これは小さい画像を返し、表示しようとしている画像が大きいため、この方法を使用すると画像がぼやけて表示されます。

もう 1 つのオプションは、これと同じ方法を使用して EXTRA_OUTPUT を渡すことです。ただし、これにはストレージの場所を配置する必要があり、私が見たすべての回答は、Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) に配置するように指示しています。ただし、onActivityResult で data.getData() を実行しようとすると、null になります。どうすればいいですか?

alert.setPositiveButton("Take Photo", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        profileFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "image_" +
                                String.valueOf(System.currentTimeMillis()) + ".jpg");

        profile = Uri.fromFile(profileFile);
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        intent.putExtra(MediaStore.EXTRA_OUTPUT, profile);


        startActivityForResult(intent, 1);
    }
});


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1 && resultCode == RESULT_OK) {

        ImageView imageView = (ImageView) findViewById(R.id.ProfileImage);

        //This returns null. 
        //I am guessing that the Environment.getExternalSt...() method is getting a storage 
        //location that does not exist. 
        //I don't know what the correct storage location is and I have not 
        //been able to find it.
        Uri u = data.getData();

        File finalFile = new File(getRealPathFromURI(u));

        Picasso.with(this).load(finalFile).into(imageView);

    }
}
4

1 に答える 1

0

Environment.getExternalSt...() メソッドが存在しないストレージの場所を取得していると推測しています。

おそらくそうではありません。ただし、EXTRA_OUTPUT値はカメラ アプリによって返されると想定しています。ACTION_IMAGE_CAPTUREドキュメントには、これが発生することを示唆するものは何もありません。

正しい保管場所がわからず、見つけることができませんでした。

画像がどこにあるべきかを知っています。で指定した場所にあるはずですEXTRA_OUTPUT。それで、そこに行って、画像があるかどうかを確認してください。ただし、カメラ アプリケーションがフォアグラウンドにある間、プロセスが実行され続けているという保証はないためprofileImage、保存されたインスタンスの状態を設定していることを確認してください。Bundleまた、多くのバグのあるACTION_IMAGE_CAPTURE実装があるため、要求した場所に画像が表示されるという保証はありません。

たとえば、 を使用ACTION_IMAGE_CAPTUREしてフル解像度の写真を撮影し、次に を使用ACTION_VIEWして画像ビューアーに結果を表示させるアクティビティを次に示します。

/***
 Copyright (c) 2008-2016 CommonsWare, LLC
 Licensed under the Apache License, Version 2.0 (the "License"); you may not
 use this file except in compliance with the License. You may obtain a copy
 of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
 by applicable law or agreed to in writing, software distributed under the
 License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
 OF ANY KIND, either express or implied. See the License for the specific
 language governing permissions and limitations under the License.

 From _The Busy Coder's Guide to Android Development_
 https://commonsware.com/Android
 */

package com.commonsware.android.camcon;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import java.io.File;

public class CameraContentDemoActivity extends Activity {
  private static final String EXTRA_FILENAME=
    "com.commonsware.android.camcon.EXTRA_FILENAME";
  private static final String FILENAME="CameraContentDemo.jpeg";
  private static final int CONTENT_REQUEST=1337;
  private File output=null;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    if (savedInstanceState==null) {
      File dir=
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

      dir.mkdirs();
      output=new File(dir, FILENAME);
    }
    else {
      output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME);
    }

    if (output.exists()) {
      output.delete();
    }

    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output));

    startActivityForResult(i, CONTENT_REQUEST);
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putSerializable(EXTRA_FILENAME, output);
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode,
                                  Intent data) {
    if (requestCode == CONTENT_REQUEST) {
      if (resultCode == RESULT_OK) {
        Intent i=new Intent(Intent.ACTION_VIEW);

        i.setDataAndType(Uri.fromFile(output), "image/jpeg");
        startActivity(i);
        finish();
      }
    }
  }
}

このサンプルアプリより)

長い目で見れば、file Uri価値が失われていくため、これは優れた解決策ではありません。公式のトレーニング ページと、この改訂版のサンプル アプリでは、代わりに使用が示されていFileProviderます。

于 2016-07-08T17:17:53.217 に答える