অ্যান্ড্রয়েডে কীভাবে startActivityForResult পরিচালনা করবেন?


969

আমার ক্রিয়াকলাপে, আমি প্রধান ক্রিয়াকলাপ থেকে দ্বিতীয় ক্রিয়াকলাপটি কল করছি startActivityForResult। আমার দ্বিতীয় ক্রিয়াকলাপে, এমন কিছু পদ্ধতি রয়েছে যা এই ক্রিয়াকলাপটি শেষ করে (সম্ভবত কোনও ফলাফল ছাড়াই) তবে তাদের মধ্যে কেবলমাত্র একটি ফলাফল প্রত্যাবর্তন করে।

উদাহরণস্বরূপ, মূল ক্রিয়াকলাপ থেকে, আমি একটি দ্বিতীয় কল করি। এই ক্রিয়াকলাপে, আমি হ্যান্ডসেটের কিছু বৈশিষ্ট্য যাচাই করে দেখছি যেমন এর ক্যামেরা রয়েছে। যদি এটি না থাকে তবে আমি এই ক্রিয়াকলাপটি বন্ধ করব। এছাড়াও, প্রস্তুতির সময় MediaRecorderবা MediaPlayerযদি কোনও সমস্যা হয় তবে আমি এই কার্যকলাপটি বন্ধ করব।

যদি এর ডিভাইসে কোনও ক্যামেরা থাকে এবং রেকর্ডিং পুরোপুরি সম্পন্ন হয়, তবে কোনও ভিডিও রেকর্ডিংয়ের পরে যদি কোনও ব্যবহারকারী সম্পন্ন বোতামটি ক্লিক করে তবে আমি ফলাফলটি (রেকর্ড করা ভিডিওর ঠিকানা) মূল ক্রিয়াকলাপে ফিরে পাঠাব।

মূল ক্রিয়াকলাপ থেকে আমি কীভাবে ফলাফলটি পরীক্ষা করব?


উত্তর:


2446

আপনার FirstActivityকলটি SecondActivityব্যবহারের startActivityForResult()পদ্ধতিটি থেকে

উদাহরণ স্বরূপ:

int LAUNCH_SECOND_ACTIVITY = 1
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, LAUNCH_SECOND_ACTIVITY);

আপনার SecondActivityসেটে আপনি যে ডেটাতে ফিরে যেতে চান তা সেট করুন FirstActivity। আপনি যদি ফিরে আসতে চান না, কোনও সেট করবেন না।

উদাহরণস্বরূপ: আপনি SecondActivityযদি ডেটা ফেরত পাঠাতে চান তবে:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

আপনি যদি ডেটা ফেরত দিতে না চান:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

এখন আপনার FirstActivityক্লাসে onActivityResult()পদ্ধতির জন্য নিম্নলিখিত কোডটি লিখুন ।

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == LAUNCH_SECOND_ACTIVITY) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}//onActivityResult

1
যখন RESUT_CANCELLED সেটরসাল্টে (RESULT_CANCELED, রিটার্ন ইনটেন্ট) স্থাপন করা হয় তখন উদ্দেশ্য কী থাকে;
ইসমাইল সাহিন

4
@ আইসইমল ধরুন SecondActivityকিছু ব্যতিক্রম ঘটেছে, সেক্ষেত্রে আপনাকে ফলাফলটিও ফেরত পাঠানো দরকার FirstActivity, সুতরাং আপনি "RESULT_CANCELLED"ক্যাচ ব্লকের মতো ফলাফলটি সেট করতে পারেন এবং ফিরে আসতে পারেন FirstActivtyএবং FirstActivity's' 'onActivityResult()সফলতা বা ব্যর্থতার ফলাফল পেয়েছেন কিনা তা পরীক্ষা করতে পারেন।
নিশান্ত

10
সুতরাং এটি আপনার উপর নির্ভর করে, যদি আপনাকে বাতিল করার কারণটি জানতে না প্রয়োজন, তবে আপনি কেবল সেটরেলসুল্ট (RESULT_CANCELED) ব্যবহার করতে পারেন; কোনও উদ্দেশ্য ছাড়াই
ইসমাইল সাহিন

2
স্টার্টঅ্যাক্টিভিটি ফর রিসাল্ট () কল করার পরে @ লী লেয়েব ফিনিশ () বলা হবে না First
নিশান্ত

6
আমার জন্য এটি কাজ করছে না - এটিই আমি অ্যান্ড্রয়েড সম্পর্কে খুব বেশি ঘৃণা করি - এই সিস্টেমটি এতটাই বিশ্বাসযোগ্য নয়: - /
মার্টিন ফেফার

50

মূল ক্রিয়াকলাপ থেকে ফলাফল কীভাবে চেক করবেন?

আপনাকে ওভাররাইড করতে হবে Activity.onActivityResult()তার পরে তার পরামিতিগুলি পরীক্ষা করতে হবে :

  • requestCodeকোন অ্যাপ্লিকেশন এই ফলাফলগুলি ফিরে এসেছে তা সনাক্ত করে। আপনি কল করার সময় এটি আপনার দ্বারা সংজ্ঞায়িত করা হয় startActivityForResult()
  • resultCode এই অ্যাপ্লিকেশনটি সফল, ব্যর্থ হয়েছে বা অন্যরকম হয়েছে কিনা তা আপনাকে অবহিত করে
  • dataএই অ্যাপ্লিকেশন দ্বারা ফিরে কোন তথ্য ধারন করে। এটা হতে পারে null

এর অর্থ হ'ল অনুরোধকোডটি কেবল প্রথম ক্রিয়াকলাপে ব্যবহৃত হয় এবং এটি কখনই দ্বিতীয় ক্রিয়াকলাপের জন্য ব্যবহৃত হয় না? যদি ২ য় ক্রিয়াকলাপের পৃথক পন্থা থাকে, তবে এটি পরিবর্তিত হবে তবে অনুরোধ কোডের সাহায্যে নয়, অভিপ্রায় অতিরিক্তের উপর ভিত্তি করে? সম্পাদনা: হ্যাঁ, stackoverflow.com/questions/5104269/...
JCarlosR

44

@ নিশান্তের উত্তরটি পরিপূরক করা, ক্রিয়াকলাপের ফলাফল ফিরিয়ে দেওয়ার সর্বোত্তম উপায় হ'ল:

Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

আমি সমস্যা ছিল

new Intent();

তারপরে আমি জানতে পারি যে সঠিক উপায়টি ব্যবহার করছে

getIntent();

বর্তমান উদ্দেশ্য পেতে


এটি একটি নতুন তৈরি করতে কিছুটা বিজোড় বোধ করে Intentযা কেবল একটি ধারণের জন্যই বিদ্যমান Bundleএবং এর মধ্যে ক্রিয়া বা উপাদানগুলির মতো সাধারণ মান নেই। তবে Intentবর্তমান ক্রিয়াকলাপটি চালু করার জন্য যা ব্যবহার করা হয়েছিল তা সংশোধন করতে এটি কিছুটা অদ্ভুত (এবং সম্ভাব্য বিপজ্জনক?) বোধও করে? সুতরাং আমি নিজেই অ্যান্ড্রয়েডের উত্সটি অনুসন্ধান করে দেখেছি যে তারা সর্বদা Intentফলাফল হিসাবে ব্যবহারের জন্য একটি নতুন তৈরি করে। উদাহরণস্বরূপ, github.com/aosp-mirror/platform_frameworks_base/blob/…
spaaarky21

হ্যালো spaaarky21, আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি দুঃখিত আমি ঠিক কীভাবে সেই সমাধানটি শেষ করেছিলাম তা ব্যাখ্যা করার ক্ষেত্রে আমি এতটা পরিষ্কার ছিলাম না বলে আমি দুঃখিত। এটি তিন বছর আগে ছিল এবং আমি কেবল মনে করতে পারি যে আমার অ্যাপটি "নতুন অভিপ্রায়" এর কারণে ক্র্যাশ হচ্ছিল, এর অর্থ আমি যখন বলছিলাম "আমার সমস্যা ছিল"। আসলে আমি "getInttent" দিয়ে চেষ্টা করেছি, কারণ এটি সময়টিতে এটি তৈরি হয়েছিল এবং এটি কার্যকর হয়েছিল! এ কারণে আমি আমার সমাধান ভাগ করে নেওয়ার সিদ্ধান্ত নিয়েছি। "সেরা উপায়" বা "সঠিক উপায়ে" বলার জন্য শব্দের সেরা পছন্দ নয়, তবে আমি আমার সমাধানটির পাশে দাঁড়িয়েছি। এটিই আমার সমস্যার সমাধান করেছে এবং স্পষ্টতই অন্যান্য লোকদের ক্ষেত্রেও। ধন্যবাদ
জুলিয়ান আলবার্তো

1
কি দারুন! দুর্দান্ত কাজ করে getIntent()অজানা ক্রিয়াকলাপে ডেটা ফেরত দেওয়ার এক উপযুক্ত উপায় বলে মনে হয়, যেখান থেকে ক্রিয়াকলাপটি বলা হয়েছিল। ধন্যবাদ!
স্যাম

43

উদাহরণ

পুরো প্রক্রিয়াটি প্রসঙ্গে দেখতে, এখানে একটি পরিপূরক উত্তর দেওয়া হল। দেখুন আমার পূর্ণাঙ্গ উত্তর আরো ব্যাখ্যার জন্য।

এখানে চিত্র বর্ণনা লিখুন

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // Add a different request code for every activity you are starting from here
    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) { // Activity.RESULT_OK

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

এটি দুটি ভিন্ন অ্যাপ এ এবং অ্যাপ্লিকেশন বি দ্বারা করা যেতে পারে? stackoverflow.com/questions/52975645/…
জেরি আব্রাহাম

12

যাদের ভুল অনুরোধে সমস্যা আছে তাদের জন্যঅ্যাক্টিভিটিস রেজাল্টে কোড দিন

আপনি যদি আপনার startActivityForResult()কাছ থেকে কল দিচ্ছেন Fragment, অনুরোধকোডটি সেই খণ্ডের মালিকানাধীন ক্রিয়াকলাপ দ্বারা পরিবর্তিত হবে।

আপনি যদি নিজের ক্রিয়ায় সঠিক ফলাফল কোডটি পেতে চান তবে এটি ব্যবহার করে দেখুন:

পরিবর্তন:

startActivityForResult(intent, 1); প্রতি:

getActivity().startActivityForResult(intent, 1);


10

আপনি যদি ক্রিয়াকলাপের ফলাফল সহ ব্যবহারকারী ইন্টারফেস আপডেট করতে চান তবে আপনি ব্যবহার করতে পারবেন না this.runOnUiThread(new Runnable() {} ইউআই এটি করা নতুন মান দিয়ে রিফ্রেশ করবে না। পরিবর্তে, আপনি এটি করতে পারেন:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_CANCELED) {
        return;
    }

    global_lat = data.getDoubleExtra("LATITUDE", 0);
    global_lng = data.getDoubleExtra("LONGITUDE", 0);
    new_latlng = true;
}

@Override
protected void onResume() {
    super.onResume();

    if(new_latlng)
    {
        PhysicalTagProperties.this.setLocation(global_lat, global_lng);
        new_latlng=false;
    }
}

এটি নির্বোধ বলে মনে হচ্ছে তবে বেশ ভাল কাজ করে।


2

প্রথম আপনি ব্যবহার startActivityForResult()প্রথম পরামিতি সঙ্গে Activityএবং যদি আপনি দ্বিতীয় থেকে তথ্য পাঠাতে চান Activityপ্রথমে Activityতারপর ব্যবহার মান পাস Intentসঙ্গে setResult()পদ্ধতি এবং ভিতরে যে ডেটা পেতে onActivityResult()প্রথম পদ্ধতি Activity


1

অ্যান্ড্রয়েডে খুব সাধারণ সমস্যা
এটি 3 টুকরো টুকরো টুকরো করা যেতে পারে
1) ক্রিয়াকলাপ বি (ক্রিয়াকলাপ এ ঘটে)
2) অনুরোধ করা ডেটা সেট করুন (ক্রিয়াকলাপে বি ঘটে)
3) অনুরোধ করা ডেটা প্রাপ্ত করুন (ক্রিয়াকলাপে ঘটে)

1) স্টার্টঅ্যাক্টিভিটি খ

Intent i = new Intent(A.this, B.class);
startActivity(i);

2) অনুরোধ করা ডেটা সেট করুন

এই অংশে, আপনি সিদ্ধান্ত নিয়েছেন যে কোনও নির্দিষ্ট ঘটনা ঘটলে আপনি ডেটা ফেরত পাঠাতে চান কিনা।
উদাহরণস্বরূপ: বি ক্রিয়াকলাপে একটি সম্পাদনা পাঠ্য এবং দুটি বোতাম বি 1, বি 2 রয়েছে।
বাটন বি 1 এ
ক্লিক করা তথ্যকে ক্রিয়াকলাপে ফেরত পাঠায় বোতাম বি 2 এ ক্লিক করা কোনও ডেটা প্রেরণ করে না।

ডেটা প্রেরণ করা হচ্ছে

b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}

ডেটা প্রেরণ করা হচ্ছে না

b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }

ব্যবহারকারীরা ক্লিক করুন পিছনে বোতামটি
ডিফল্টরূপে, ক্রিয়াকলাপের সাথে ফলাফল সেট করা হয় SULআরআইসেলT_সিএনএসএল প্রতিক্রিয়া কোড

3) ফলাফল পুনরুদ্ধার

তার জন্যঅ্যাক্টিভিটিস রেজাল্ট পদ্ধতিতে ওভাররাইড

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RES_CODE_A) {

     // b1 was clicked 
   String x = data.getStringExtra("RES_CODE_A");

}
else if(resultCode == RES_CODE_B){

   // b2 was clicked

}
else{
   // back button clicked 
}
}

1

অ্যাক্টিভিটি রিসাল্ট রিজিস্ট্রি হ'ল প্রস্তাবিত পদ্ধতি

ComponentActivityএখন একটি উপলব্ধ ActivityResultRegistryআপনি সব ব্যবস্থা করতে দেয় startActivityForResult()+ + onActivityResult()সেইসাথে requestPermissions()+ + onRequestPermissionsResult()আপনার পদ্ধতি অগ্রাহ্য ছাড়া প্রবাহিত Activityবা Fragmentমাধ্যমে বর্ধিত টাইপ নিরাপত্তা এনেছে ActivityResultContract, ও পরীক্ষামূলক এই প্রবাহিত জন্য হুক্স প্রদান করে।

অ্যান্ড্রয়েডএক্স ক্রিয়াকলাপ 1.2.0-alpha02 এবং খণ্ড 1.3.0-alpha02 এ প্রবর্তিত ক্রিয়াকলাপ ফলাফল API গুলি ব্যবহার করার জন্য দৃ strongly়ভাবে সুপারিশ করা হয়।

এটি আপনার যুক্ত করুন build.gradle

def activity_version = "1.2.0-alpha03"

// Java language implementation
implementation "androidx.activity:activity:$activity_version"
// Kotlin
implementation "androidx.activity:activity-ktx:$activity_version"

প্রাক-নির্মিত চুক্তিটি কীভাবে ব্যবহার করবেন?

এই নতুন এপিআই-র নিম্নলিখিত বিল্ট কার্যকারিতা রয়েছে

  1. TakeVideo
  2. PickContact
  3. GetContent
  4. GetContents
  5. ওপেন-ডকুমেন্ট
  6. OpenDocuments
  7. OpenDocumentTree
  8. CreateDocument
  9. ডায়াল
  10. ছবি তোলা
  11. অনুমতির অনুরোধ
  12. RequestPermissions

টেকপিকচার চুক্তি ব্যবহার করে এমন একটি উদাহরণ:

private val takePicture = prepareCall(ActivityResultContracts.TakePicture()) 
     { bitmap: Bitmap? ->
        // Do something with the Bitmap, if present
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener { takePicture() }
       }

তাহলে এখানে কি হচ্ছে? এটি কিছুটা ভাঙ্গা যাক। takePictureএটি কেবলমাত্র একটি কলব্যাক যা একটি বিলট ম্যাপকে ফিরিয়ে দেয় - onActivityResultপ্রক্রিয়াটি সফল হয়েছিল কিনা তার উপর এটি নাল নির্ভর করে । prepareCallতারপরে এই কলটিকে একটি নতুন বৈশিষ্ট্যে নিবন্ধভুক্ত করে ComponentActivityযার নাম রয়েছে ActivityResultRegistry- আমরা পরে এটিতে ফিরে আসব। ActivityResultContracts.TakePicture()গুগল আমাদের জন্য তৈরি করেছেন এমন অন্তর্নির্মিত takePictureসহায়কগুলির মধ্যে একটি এবং অবশেষে অনুরোধ করা ঠিক তেমনভাবে ইন্টেন্টকে ট্রিগার করে যা আপনি আগে করেছিলেন Activity.startActivityForResult(intent, REQUEST_CODE)

কিভাবে কাস্টম চুক্তি লিখবেন?

সাধারণ চুক্তি যা ইনপুট হিসাবে কোনও ইন্টার নেয় এবং এমন একটি স্ট্রিং দেয় যা অনুরোধী ক্রিয়াকলাপটিকে ফলাফল হিসাবে প্রত্যাবর্তন করে।

    class MyContract : ActivityResultContract<Int, String>() {

    companion object {
        const val ACTION = "com.myapp.action.MY_ACTION"
        const val INPUT_INT = "input_int"
        const val OUTPUT_STRING = "output_string"
    }

    override fun createIntent(input: Int): Intent {
        return Intent(ACTION)
            .apply { putExtra(INPUT_INT, input) }
    }

    override fun parseResult(resultCode: Int, intent: Intent?): String? {
        return when (resultCode) {
            Activity.RESULT_OK -> intent?.getStringExtra(OUTPUT_STRING)
            else -> null
        }
    }
}



    class MyActivity : AppCompatActivity() {

    private val myActionCall = prepareCall(MyContract()) { result ->
        Log.i("MyActivity", "Obtained result: $result")
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        button.setOnClickListener {
            myActionCall(500)
        }
    }
}

আরও তথ্যের জন্য এই অফিসিয়াল ডকুমেন্টেশন চেক করুন ।


0
You need to override Activity.onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_CODE_ONE) {


   String a = data.getStringExtra("RESULT_CODE_ONE");

}
else if(resultCode == RESULT_CODE_TWO){

   // b was clicked

}
else{

}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.