2016-05-13 21 views
0

Androidアプリの開発の基礎を学び始めました。ボタンをタップすると、既存のカメラアプリを使って写真を撮影して保存できるアプリを作りたかったのです。Android-Cantは簡単な写真アプリを手に入れます

私はthisのチュートリアル(Androidスタジオを使用しています)をコアコードに従っており、私は自分のアプリを作っています。ちなみに、写真を撮影した後は、それをギャラリーに保存することはできません。

私はコードにさまざまなバリエーションを試しましたが、うまくいきませんでした。 logcatの窓には、私はカメラを開くボタンをタップすると、アプリを実行している間、私はこのログを得た(私は本当にinfulentされているかどうかかどうかわからないもの)

5月13日午後07時25分:38.974 24578から24602/seba.fotoappのE /表面:getSlotFromBufferLocked:不明バッファ:

MainActivity:0xb99d9980

私はアンドロイド6.0(API23)を実行している

は、ここに私のコードです。 Java

package seba.fotoapp; 

import android.Manifest; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.ActivityCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 

import java.io.File; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MainActivity extends AppCompatActivity { 
// Storage Permissions 
private static final int REQUEST_EXTERNAL_STORAGE = 1; 
private static String[] PERMISSIONS_STORAGE = { 
     Manifest.permission.WRITE_EXTERNAL_STORAGE, 
     Manifest.permission.READ_EXTERNAL_STORAGE 
}; 

String mCurrentPhotoPath; 
/** 
* Checks if the app has permission to write to device storage 
* 
* If the app does not has permission then the user will be prompted to grant permissions 
* 
* @param activity 
*/ 
public static void verifyStoragePermissions(Activity activity) { 
    // Check if we have write permission 
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 

    if (permission != PackageManager.PERMISSION_GRANTED) { 
     // We don't have permission so prompt the user 
     ActivityCompat.requestPermissions(
       activity, 
       PERMISSIONS_STORAGE, 
       REQUEST_EXTERNAL_STORAGE 
     ); 
    } 
} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
    Button take_picture = (Button) findViewById(R.id.take_picture); 
    take_picture.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      dispatchTakePictureIntent(); 
     } 
    }); 
} 

@Override 
protected void onStart(){ 
    super.onStart(); 
    verifyStoragePermissions(this); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

static final int REQUEST_TAKE_PHOTO = 1; 

private void dispatchTakePictureIntent() { 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    // Ensure that there's a camera activity to handle the intent 
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
     // Create the File where the photo should go 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      // Error occurred while creating the File 
      System.out.println(ex); 
     } 
     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
        Uri.fromFile(photoFile)); 
      startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
      galleryAddPic(); 
     } 
    } 
} 

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

private void galleryAddPic() { 
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
    File f = new File(mCurrentPhotoPath); 
    Uri contentUri = Uri.fromFile(f); 
    mediaScanIntent.setData(contentUri); 
    this.sendBroadcast(mediaScanIntent); 
} 

} 

のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="seba.fotoapp" > 
<uses-feature android:name="android.hardware.camera" 
    android:required="true" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

</manifest> 

答えて

1

画像をキャプチャし、確かにそれを保存するために、あなたは(あなたが持っている)Androidのキャプチャの意図を必要とします。 dispatchTakePictureIntent()に行く代わりに、インテントを直接実行してください。あなたのボタン作成(のonCreate)で

Button take_picture = (Button) findViewById(R.id.take_picture); 
take_picture.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     // Creates an Intent to the camera 
      Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      // ARGS: the intent, a key to access later 
      startActivityForResult(i, REQUEST_TAKE_PHOTO); 
    } 
}); 

次にカメラを開くためにonActivityResultメソッドを使用します。

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == REQUEST_TAKE_PHOTO && data != null) { 
     try { 
      Bitmap selectedImg = (Bitmap) data.getExtras().get("data"); 
      Log.i("Picture from Camera", "Captured"); 

      // Create a file to write bitmap data 
      File f = new File(getApplicationContext().getCacheDir(), "image.png"); 
      f.createNewFile(); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

は、ビットマップまたは作成されたファイルのいずれかで何かを。あなたは画像を保存するために、このコードを見てもよいAkashBhaveによって与えられた答えに続き

1

..

private void SaveImage(Bitmap finalBitmap) { 
String root = Environment.getExternalStorageDirectory().toString(); 
File myDir = new File(root + "/saved_images");  
myDir.mkdirs(); 
Random generator = new Random(); 
int n = 10000; 
n = generator.nextInt(n); 
String fname = "Image-"+ n +".jpg"; 
File file = new File (myDir, fname); 
if (file.exists()) file.delete(); 
try { 
    FileOutputStream out = new FileOutputStream(file); 
    finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
    out.flush(); 
    out.close(); 

} catch (Exception e) { 
     e.printStackTrace(); 
} 
} 
関連する問題