2016-07-08 6 views
1

私はユーザーが写真を撮ることができ、その写真が画像ビューに保存されるようなアプリを作ろうとしています。私はこれを動作させるために数十の方法を試した。Android:カメラで写真を撮り、フル解像度の画像をimagviewに保存するにはどうすればよいですか?

私が見た多くの答えは、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); 

    } 
} 

答えて

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(); 
     } 
    } 
    } 
} 

this sample appから)

以上この長い解決策は、fileUri values are going awayのような素晴らしい解決策ではありません。 official training pagethis revamped edition of my sample appは、代わりにFileProviderを使用しています。

+0

EXTRA_OUTPUTが返されないということを意味しますか?これが間違っている場合は、インテントデータをどのように取得するのですか? また、携帯電話の保存場所を探しましたが、見つけられませんでした。私は私のコンピュータ上の私の電話のストレージを見てそれを見つけました。これは場所[リンク](http://i.imgur.com/MgAYa9U.png)です(役立つかどうかわかりません)。ギャラリーの場所に保存する方法を知っていますか? [link](http://i.imgur.com/GhdIWB8.png) – kindOfABigDeal

+0

実際に取得しようとしているフォルダが間違っています。それは私にこの場所/記憶/エミュレート/ 0/Pictures /存在しないものを与えます。最後の画像にPicturesディレクトリがあります。 – kindOfABigDeal

+0

@kindOfABigDeal:「EXTRA_OUTPUTが返されないのはどういう意味ですか?」 - あなたは 'EXTRA_OUTPUT'に入れた値を保持する必要があることを意味します。その価値はあなたが「意図」の結果に戻ってこない。「実際には取得しようとしているフォルダが間違っています」 - これは[外部ストレージ]の正しい場所です(https://commonsware.com/blog/2014/04/08/storage-situation-external- storage.html)。 – CommonsWare

関連する問題