নাল অভিপ্রায় সমস্যা এড়ানো সহজ ওয়ার্কিং ক্যামেরা অ্যাপ
- সমস্ত উত্তর কোড এই উত্তর অন্তর্ভুক্ত; অ্যান্ড্রয়েড টিউটোরিয়াল কাছাকাছি
আমি এই ইস্যুতে প্রচুর সময় ব্যয় করছি, তাই আমি একটি অ্যাকাউন্ট তৈরি করে আমার ফলাফলগুলি আপনার সাথে ভাগ করে নেওয়ার সিদ্ধান্ত নিয়েছি।
অফিসিয়াল অ্যান্ড্রয়েড টিউটোরিয়াল "ফটো তোলা সহজভাবে" প্রমাণিত হয়েছিল যে এটি প্রতিশ্রুতি দিয়েছিল তা পুরোপুরি না ধরে। সেখানে প্রদত্ত কোডটি আমার ডিভাইসে কাজ করে নি: একটি স্যামসং গ্যালাক্সি এস 4 মিনি জিটি-আই 9195 অ্যান্ড্রয়েড সংস্করণ 4.4.2 / কিটকেট / এপিআই স্তর 19 চালাচ্ছে।
আমি বুঝতে পেরেছি যে ছবিটি ক্যাপচার করার সময় মূল সমস্যাটি হ'ল পদ্ধতিটির নিম্নলিখিত লাইনটি ছিল ( dispatchTakePictureIntent
টিউটোরিয়ালে):
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
ফলস্বরূপ শূন্য হয়ে ধরা পরে এটির উদ্দেশ্য হয়েছিল onActivityResult
।
এই সমস্যা সমাধানের জন্য, আমি এখানে পূর্বের উত্তরগুলি বাইরে অনেক অনুপ্রেরণা টানা এবং GitHub উপর কিছু সহায়ক পোস্ট (বেশিরভাগই deepwinter দ্বারা এই এক - তাঁকে অনেক ধন্যবাদ; আপনি যদি একটি ঘনিষ্ঠভাবে সম্পর্কিত তার উত্তর খুঁজে বার করো করতে চাইতে পারেন পোস্টটি ভাল হিসাবে)।
এই আনন্দদায়ক পরামর্শ অনুসরণ করে, আমি উল্লিখিত putExtra
লাইনটি মুছে ফেলার এবং তার পরিবর্তে onctivityResult () পদ্ধতির মধ্যে ক্যামেরা থেকে তোলা ছবিটি ফিরিয়ে আনতে সম্পর্কিত জিনিসটি বেছে নিয়েছি। ছবির সাথে যুক্ত বিটম্যাপটি ফিরে পেতে কোডের সিদ্ধান্ত নেওয়া লাইনগুলি হ'ল:
Uri uri = intent.getData();
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
} catch (IOException e) {
e.printStackTrace();
}
আমি একটি অনুকরণীয় অ্যাপ্লিকেশন তৈরি করেছি যা কেবল ছবি তোলার, এসডি কার্ডে এটি সংরক্ষণ এবং এটি প্রদর্শন করার ক্ষমতা রাখে। আমি মনে করি যে এই সমস্যাটি নিয়ে আমি যখন হোঁচট খেয়েছি তখন আমার মতো একই পরিস্থিতিতে লোকের পক্ষে এটি সহায়ক হতে পারে, কারণ বর্তমান সহায়তার পরামর্শগুলি বেশিরভাগ বিস্তৃত গিথুব পোস্টগুলিকে উল্লেখ করে যা প্রশ্নে কাজ করে তবে নতুনদের মতো পর্যবেক্ষণ করা খুব সহজ নয় are আমাকে. একটি নতুন প্রকল্প তৈরি করার সময় অ্যান্ড্রয়েড স্টুডিওগুলি প্রতি ডিফল্ট হিসাবে তৈরি ফাইল সিস্টেমের বিষয়ে, আমার উদ্দেশ্যটির জন্য আমাকে কেবল তিনটি ফাইল পরিবর্তন করতে হয়েছিল:
কার্যকলাপ_মাইন.এক্সএমএল:
<?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>
মেইনএ্যাকটিভিটি.জভা:
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);
}
}
}
অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল:
<?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>
নোট করুন যে সমস্যার জন্য আমি যে সমাধানটি পেয়েছি তার ফলে অ্যান্ড্রয়েড ম্যানিফেস্ট ফাইলটি সরলকরণের দিকে পরিচালিত হয়েছে: প্রোভাইডার যুক্ত করার ক্ষেত্রে অ্যান্ড্রয়েড টিউটোরিয়াল দ্বারা প্রস্তাবিত পরিবর্তনগুলি আর প্রয়োজন নেই যেহেতু আমি আমার জাভা কোডটিতে কোনও ব্যবহার করছি না। অতএব, অনুমতি সম্পর্কিত প্রায় কয়েকটি স্ট্যান্ডার্ড লাইনই - প্রকাশিত ফাইলটিতে যুক্ত করতে হয়েছিল be
এ ছাড়াও এটি উল্লেখ করা মূল্যবান হতে পারে যে অ্যান্ড্রয়েড স্টুডিওর অটোমপোর্ট হ্যান্ডলিং করতে সক্ষম হতে পারে না java.text.SimpleDateFormat
এবং java.util.Date
। আমাকে দুটোই নিজে আমদানি করতে হয়েছিল।