【问题标题】:How i can get Uri from intent?我如何从意图中获取 Uri?
【发布时间】:2016-09-06 18:28:02
【问题描述】:

我做到了

@Override
public void onClick(View v) {
    switch (v.getId()){
        //если выбрали камеру - запускаем ее
        case R.id.b_camera:
            //uri = generateFileUri();
            if (uri == null) {
                Toast.makeText(getView().getContext(), getResources().getString(R.string.sdnot), Toast.LENGTH_LONG).show();
                return;
            }
            Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            //intentCamera.putExtra("return-data", true);
            startActivityForResult(intentCamera, PHOTO_INTENT_REQUEST_CODE);
        break;
    }
}

方法 generateFileUri() 在 onCreateView() 中被调用。 行 intentCamera.putExtra("return-data", true);对我不起作用(如果在 getParceble() 的 onActivityResult 中使用“return-data”作为键)。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturned) {

    switch (requestCode) {

        //если результат пришел от камеры
        case PHOTO_INTENT_REQUEST_CODE:
            if (resultCode == getActivity().RESULT_OK) {
                Log.i("HHHHHHHHHHHH", "result ok");
                //извлекаем uri фотки из интента
                Uri selectedImage = imageReturned.getData();
                Log.i("HHHHHHHHHHHH", "getdata works!");
                //создаем интент для запуска новой активити
                Intent last_intent_photo = new Intent(getView().getContext(), ViewPhoto.class);
                //помещаем в интент этот uri
                last_intent_photo.putExtra("fotka",selectedImage);
                //стартуем новую активити
                startActivity(last_intent_photo);

            } else if (resultCode == getActivity().RESULT_CANCELED)
                Toast.makeText(getView().getContext(), "Capture cancelled", Toast.LENGTH_LONG).show();
            else
                Toast.makeText(getView().getContext(), "Capture failed", Toast.LENGTH_LONG).show();
                break;
        default: super.onActivityResult(requestCode, resultCode, imageReturned);

    }
}

我看到日志“结果正常”。我认为这意味着相机做得很好。 但后来我看到:传递结果 ResultInfo{who=android:fragment:2, request=100, result=-1, data=null} 失败。怎么可能?!

好吧,我试过 Uri selectedImage = imageReturned.getExtras().getParcelable();但我没有将其放入 getParcelable(String key) 的意图。

那么,为什么结果没问题,但 data=null?

【问题讨论】:

  • 请附上您如何启动相机的代码

标签: android android-intent android-camera


【解决方案1】:

选项 1:

//Uri myUri = ...
intent.setData(myUri);

Uri uri = intent.getData();

选项 2:

根据文档:

toString() - 返回此 URI 的编码字符串表示形式

//Uri myUri = ...
intent.putStringExtra("uri",myUri.toString());

String uriString = intent.getStringExtra("uri");
Uri uri = Uri.parse(uriString);

【讨论】:

    【解决方案2】:

    既然您自己传递它,为什么需要从intert 获取uri?只需使用相同的uri

    intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    

    UPD 澄清

    当您使用选项启动cameta时:

    intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    

    您是在告诉相机照片必须存储在此路径中。因此,如果结果正常,您需要通过此 uri 获取该照片。

     if (resultCode == getActivity().RESULT_OK) {
        Log.i("HHHHHHHHHHHH", "result ok");
    
        // same as passed in intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        Uri selectedImage = uri; 
    
        Log.i("HHHHHHHHHHHH", "getdata works!");
        //создаем интент для запуска новой активити
        Intent last_intent_photo = new Intent(getView().getContext(), ViewPhoto.class);
        //помещаем в интент этот uri
        last_intent_photo.putExtra("fotka",selectedImage);
        //стартуем новую активити
        startActivity(last_intent_photo);
    } 
    

    UPD 2

    FragmentScaling.onActivityCreated:

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    
        if (getActivity().getIntent().hasExtra("uri")) {
            uri = (Uri)getActivity().getIntent().getParcelableExtra("uri");
        }
    }
    

    【讨论】:

    • 可能是我做错了,但我需要在制作照片后用这张照片打开一个新活动,所以在 onAvtivityResult 我有来自相机的意图,我从这个意图中获取 uri 并为新活动制定新意图.我说的对吗?
    • 我做到了,现在我有: I/HHHHHHHHHHHH:结果正常 致命异常:主进程:ru.bunakov.testapplication,PID:8610 java.lang.RuntimeException:无法恢复活动 {ru. bunakov.testapplication/ru.bunakov.testapplication.MainActivity}: java.lang.RuntimeException: 将结果 ResultInfo{who=android:fragment:2, request=100, result=-1, data=null} 传递给活动失败
    • 在 onActivityResult 我检查是否 (resultCode == getActivity().RESULT_OK && imageReturned != null) 但在日志中我看到:失败交付结果 ResultInfo{who=android:fragment:1, request=100 , result=-1, data=null} 怎么可能? //我在下面添加了MainActivity代码
    【解决方案3】:

    主活动

        public class MainActivity extends AppCompatActivity {
    
        FragmentManager fragmentManager;
        PreferenceHelper preferenceHelper;
    
        //вызывается при создании активити
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            PreferenceHelper.getInstance().init(getApplicationContext());
            preferenceHelper = PreferenceHelper.getInstance();
    
            fragmentManager = getFragmentManager();
    
            runSplash();
    
            setUI();
        }
    
    
        //метод для созданию интерфейса
        private void setUI(){
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            if (toolbar != null){
                toolbar.setTitleTextColor(getResources().getColor(R.color.white));
                setSupportActionBar(toolbar);
            }
            TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
            tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_list_white_18dp).setText(R.string.listtab));
            tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_camera_alt_white_18dp).setText(R.string.scalingtab));
            tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_web_asset_white_18dp).setText(R.string.parsingtab));
            tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_my_location_white_18dp).setText(R.string.maptab));
    
            final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
            TabAdapter tabAdapter = new TabAdapter(fragmentManager, 4);
            viewPager.setAdapter(tabAdapter);
            viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    
            tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    viewPager.setCurrentItem(tab.getPosition());
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
        }
    }
    

    我什至无法想象究竟在哪里寻找错误......

    //получаем результат из галереи или камеры
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent imageReturned) {
    
        switch (requestCode) {
    
            //если результат пришел от камеры
            case PHOTO_INTENT_REQUEST_CODE:
                if (resultCode == getActivity().RESULT_OK && imageReturned != null) {
                    Log.i("HHHHHHHHHHHH", "result ok"); // появляется в логе
                    //извлекаем uri фотки из интента
                    Uri selectedImage = uri;
                    Log.i("HHHHHHHHHHHH", "getdata works!"); //в логе не появляется!
                    //создаем интент для запуска новой активити
                    Intent last_intent_photo = new Intent(getView().getContext(), ViewPhoto.class);
                    //помещаем в интент этот uri
                    last_intent_photo.putExtra("fotka", selectedImage);
                    //стартуем новую активити
                    startActivity(last_intent_photo);
    
                } else if (resultCode == getActivity().RESULT_CANCELED)
                    Toast.makeText(getView().getContext(), "Capture cancelled", Toast.LENGTH_LONG).show();
                else
                    Toast.makeText(getView().getContext(), "Capture failed", Toast.LENGTH_LONG).show();
                    break;
            default: super.onActivityResult(requestCode, resultCode, imageReturned);
    
        }
    }
    

    【讨论】:

    • давайнарусском)когдатывызываешьintentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);тыговоришьчтобыкартинкасохраниласьпоэтомуuri,еслипришелRESULT_OKзначиткартинкасохраниласьпоэтомуurl。 Если падает ошибка пришли весь стектрейс
    • I/HHHHHHHHHHHH:结果正常 E/AndroidRuntime:致命异常:主进程:ru.bunakov.testapplication,PID:12877 java.lang.RuntimeException:传递结果失败 ResultInfo{who=android:fragment: 1, request=100, result=-1, data=null} 到活动{ru.bunakov.testapplication/ru.bunakov.testapplication.MainActivity}:
    • java.lang.NullPointerException:尝试在 android.app.ActivityThread.deliverResults(ActivityThread) 的空对象引用上调用虚拟方法 'android.os.Bundle android.content.Intent.getExtras()' .java:3680) 原因:java.lang.NullPointerException:尝试在 ru.bunakov.testapplication.fragments.FragmentScaling 的空对象引用上调用虚拟方法 'android.os.Bundle android.content.Intent.getExtras()' .onActivityResult(FragmentScaling.java:91)
    • этот метод прикрепи FragmentScaling.onActivityResult
    • Я уже туплю。 куда его прикреплять?
    【解决方案4】:

    最近 onActivityResult 已被弃用,因此

    private val getIntent = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            if (it.resultCode == Activity.RESULT_OK) {
                if (it.data != null) {
                    val imageUri = it.data!!.data as Uri
                    val image = yourCustomMethod(imageUri)
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 2020-11-02
      • 2021-04-11
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多