सरल कार्य कैमरा ऐप अशक्त इरादे की समस्या से बचा रहा है
- इस उत्तर में शामिल सभी परिवर्तित कोड; Android ट्यूटोरियल के करीब
मैं इस मुद्दे पर बहुत समय बिता रहा हूं, इसलिए मैंने एक खाता बनाने और अपने परिणामों को आपके साथ साझा करने का निर्णय लिया है।
आधिकारिक एंड्रॉइड ट्यूटोरियल "टेकिंग फोटोज सिंपल" काफी वादे के अनुरूप नहीं निकला। प्रदान किया गया कोड मेरे डिवाइस पर काम नहीं करता था: एक सैमसंग गैलेक्सी एस 4 मिनी जीटी- I9195 एंड्रॉइड वर्जन 4.4.2 / किटकैट / एपीआई लेवल 19 चला रहा था।
मुझे पता चला कि तस्वीर को कैप्चर करते समय मुख्य समस्या निम्नलिखित विधि में थी ( dispatchTakePictureIntent
ट्यूटोरियल में):
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
इसका परिणाम यह हुआ कि बाद में यह onActivityResult
शून्य हो गया।
इस समस्या को हल करने के लिए, मैंने यहाँ पहले के उत्तरों से बहुत प्रेरणा ली और जीथब पर कुछ सहायक पोस्ट (ज्यादातर डीपविनर द्वारा यह एक - उसके लिए बड़ा धन्यवाद; आप उसके उत्तर को निकट से संबंधित पोस्ट पर भी जांचना चाह सकते हैं )।
सलाह के इन सुखद टुकड़ों के बाद, मैंने उल्लिखित putExtra
लाइन को हटाने और इसके बजाय onActivityResult () विधि के भीतर कैमरे से ली गई तस्वीर को वापस लाने की संबंधित चीज़ को करने की रणनीति को चुना । चित्र के साथ जुड़े बिटमैप को वापस पाने के लिए कोड की निर्णायक लाइनें हैं:
Uri uri = intent.getData();
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
} catch (IOException e) {
e.printStackTrace();
}
मैंने एक अनुकरणीय ऐप बनाया है जिसमें सिर्फ एक तस्वीर लेने की क्षमता है, इसे एसडी कार्ड पर सहेजें और इसे प्रदर्शित करें। मुझे लगता है कि यह मेरे लिए उसी स्थिति में लोगों के लिए मददगार हो सकता है जब मैं इस मुद्दे पर ठोकर खाई थी, क्योंकि वर्तमान मदद सुझाव ज्यादातर व्यापक गीथूब पोस्टों का उल्लेख करते हैं जो सवाल में बात करते हैं लेकिन नए जैसे के लिए देखरेख करना बहुत आसान नहीं है मुझे। फ़ाइल सिस्टम के संबंध में एंड्रॉइड स्टूडियो एक नई परियोजना बनाते समय डिफ़ॉल्ट रूप से बनाता है, मुझे सिर्फ अपने उद्देश्य के लिए तीन फाइलें बदलनी थीं:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.android.simpleworkingcameraapp.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="takePicAndDisplayIt"
android:text="Take a pic and display it." />
<ImageView
android:id="@+id/image1"
android:layout_width="match_parent"
android:layout_height="200dp" />
</LinearLayout>
MainActivity.java:
package com.example.android.simpleworkingcameraapp;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private ImageView image;
static final int REQUEST_TAKE_PHOTO = 1;
String mCurrentPhotoPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.image1);
}
// copied from the android development pages; just added a Toast to show the storage location
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmm").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();
Toast.makeText(this, mCurrentPhotoPath, Toast.LENGTH_LONG).show();
return image;
}
public void takePicAndDisplayIt(View view) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) {
File file = null;
try {
file = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
}
startActivityForResult(intent, REQUEST_TAKE_PHOTO);
}
}
@Override
protected void onActivityResult(int requestCode, int resultcode, Intent intent) {
if (requestCode == REQUEST_TAKE_PHOTO && resultcode == RESULT_OK) {
Uri uri = intent.getData();
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
} catch (IOException e) {
e.printStackTrace();
}
image.setImageBitmap(bitmap);
}
}
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.simpleworkingcameraapp">
<!--only added paragraph-->
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- only crucial line to add; for me it still worked without the other lines in this paragraph -->
<uses-permission android:name="android.permission.CAMERA" />
<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">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
ध्यान दें कि समस्या के लिए मुझे जो समाधान मिला, वह एंड्रॉइड मैनिफ़ेस्ट फ़ाइल के सरलीकरण का कारण बना: प्रदाता द्वारा जोड़ने के संदर्भ में एंड्रॉइड ट्यूटोरियल द्वारा सुझाए गए परिवर्तनों की अब आवश्यकता नहीं है क्योंकि मैं अपने जावा कोड में किसी का उपयोग नहीं कर रहा हूं। इसलिए, अनुमतियों के संबंध में केवल कुछ मानक लाइनें-ही-प्रकट फ़ाइल में जोड़ी जानी थीं।
यह अतिरिक्त रूप से यह इंगित करने के लिए मूल्यवान हो सकता है कि एंड्रॉइड स्टूडियो के ऑटोइमपोर्ट को संभालने में सक्षम नहीं हो सकता है java.text.SimpleDateFormat
और java.util.Date
। मुझे उन दोनों को मैन्युअल रूप से आयात करना पड़ा।