code to access an external app's camera capabilities
Last active
September 9, 2018 15:28
-
-
Save OrenBochman/97022b8b9b9920a8c9f1b21840264bfc to your computer and use it in GitHub Desktop.
easy camera
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
package="com.example.oren.easycam"> | |
<uses-feature | |
android:name="android.hardware.camera" | |
android:required="true" /> | |
<uses-permission | |
android:name="android.permission.WRITE_EXTERNAL_STORAGE" | |
android:maxSdkVersion="18" /> | |
<application | |
android:allowBackup="true" | |
android:icon="@mipmap/ic_launcher" | |
android:label="@string/app_name" | |
android:roundIcon="@mipmap/ic_launcher_round" | |
android:supportsRtl="true" | |
android:theme="@style/AppTheme"> | |
<provider | |
android:name="android.support.v4.content.FileProvider" | |
android:authorities="com.example.oren.easycam" | |
android:exported="false" | |
android:grantUriPermissions="true"> | |
<meta-data | |
android:name="android.support.FILE_PROVIDER_PATHS" | |
android:resource="@xml/file_paths"></meta-data> | |
</provider> | |
<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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<paths xmlns:android="http://schemas.android.com/apk/res/android"> | |
<external-path name="my_images" path="Android/data/com.example.oren.easycam/files/Pictures" /> | |
</paths>file_paths.xml |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.oren.easycam; | |
import android.content.Intent; | |
import android.graphics.Bitmap; | |
import android.graphics.BitmapFactory; | |
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.content.FileProvider; | |
import android.support.v7.app.AppCompatActivity; | |
import android.support.v7.widget.Toolbar; | |
import android.util.Log; | |
import android.view.View; | |
import android.view.Menu; | |
import android.view.MenuItem; | |
import android.widget.ImageView; | |
import java.io.File; | |
import java.io.IOException; | |
import java.text.SimpleDateFormat; | |
import java.util.Date; | |
public class MainActivity extends AppCompatActivity { | |
String TAG = "MainActivity"; | |
ImageView mImageView; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
Toolbar toolbar = findViewById(R.id.toolbar); | |
setSupportActionBar(toolbar); | |
mImageView = findViewById(R.id.image); | |
FloatingActionButton fab = findViewById(R.id.fab); | |
fab.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
// takePicture(); | |
dispatchTakePictureIntent(); | |
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) | |
.setAction("Action", null).show(); | |
} | |
}); | |
} | |
static final int REQUEST_IMAGE_CAPTURE = 1; | |
@Override | |
protected void onActivityResult(int requestCode, int resultCode, | |
Intent data) { | |
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { | |
//Bundle extras = data.getExtras(); | |
//Bitmap thumbBitmap = (Bitmap) extras.get("data"); | |
//mImageView.setImageBitmap(thumbBitmap); | |
setPic(); | |
galleryAddPic(); | |
} | |
} | |
String mCurrentPhotoPath; | |
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 = getExternalFilesDir(Environment.DIRECTORY_PICTURES); | |
File image = File.createTempFile( | |
imageFileName, /* prefix */ | |
".jpg", /* suffix */ | |
storageDir /* directory */ | |
); | |
// Save a file: path for use with ACTION_VIEW intents | |
mCurrentPhotoPath = image.getAbsolutePath(); | |
return image; | |
} | |
static final int REQUEST_TAKE_PHOTO = 1; | |
private void takePicture() { | |
Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); | |
if (captureIntent.resolveActivity(getPackageManager()) != null) { | |
startActivityForResult(captureIntent, REQUEST_IMAGE_CAPTURE); | |
} | |
} | |
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 | |
Log.e(TAG, "dispatchTakePictureIntent: ", ex); | |
} | |
// Continue only if the File was successfully created | |
if (photoFile != null) { | |
Uri photoURI = FileProvider.getUriForFile(this, | |
"com.example.oren.easycam", | |
photoFile); | |
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); | |
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); | |
} | |
} | |
} | |
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); | |
} | |
private void setPic() { | |
// Get the dimensions of the View | |
int targetW = mImageView.getWidth(); | |
int targetH = mImageView.getHeight(); | |
// Get the dimensions of the bitmap | |
BitmapFactory.Options bmOptions = new BitmapFactory.Options(); | |
bmOptions.inJustDecodeBounds = true; | |
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); | |
int photoW = bmOptions.outWidth; | |
int photoH = bmOptions.outHeight; | |
// Determine how much to scale down the image | |
int scaleFactor = Math.min(photoW / targetW, photoH / targetH); | |
// Decode the image file into a Bitmap sized to fill the View | |
bmOptions.inJustDecodeBounds = false; | |
bmOptions.inSampleSize = scaleFactor; | |
bmOptions.inPurgeable = true; | |
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); | |
mImageView.setImageBitmap(bitmap); | |
} | |
@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); | |
} | |
//TODO: add sharing | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment