Android 如何从intent获取Uri?
是的 方法generateFileUri()在onCreateView()中调用。 行intentCamera.putExtra(“返回数据”,true);不适用于我(如果在getParceble()中将“返回数据”用作onActivityResult中的键) 我看到日志“结果正常”。我认为这台照相机工作得很好。 但随后我看到:未能交付结果ResultInfo{who=android:fragment:2,request=100,result=-1,data=null}。怎么会这样 好的,我试过Uri selectedImage=imageReturned.getExtras().getParcelable();但我并没有将其放入getParcelable(字符串键)中的密钥Android 如何从intent获取Uri?,android,android-intent,android-camera,Android,Android Intent,Android Camera,是的 方法generateFileUri()在onCreateView()中调用。 行intentCamera.putExtra(“返回数据”,true);不适用于我(如果在getParceble()中将“返回数据”用作onActivityResult中的键) 我看到日志“结果正常”。我认为这台照相机工作得很好。 但随后我看到:未能交付结果ResultInfo{who=android:fragment:2,request=100,result=-1,data=null}。怎么会这样 好的,我试过
那么,为什么结果是可以的,但data=null?既然您自己在传递
intert
,为什么您需要从uri
中获取它?只需使用与以下相同的uri
:
@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);
}
}
UPD澄清:
使用以下选项启动cameta时:
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
您正在告诉相机照片必须存储在此路径中。因此,如果结果正常,则需要通过此uri获取该照片
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
UPD 2
FragmentScaling.onActivity已创建:
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);
}
主要活动
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getActivity().getIntent().hasExtra("uri")) {
uri = (Uri)getActivity().getIntent().getParcelableExtra("uri");
}
}
我甚至无法想象到底到哪里去寻找错误
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) {
}
});
}
}
选项1:
//получаем результат из галереи или камеры
@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);
}
}
及
选项2:
//получаем результат из галереи или камеры
@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);
}
}
根据文件:
toString()-返回此URI的编码字符串表示形式
及
请附上代码,说明你是如何开始拍摄的可能是我搞错了,但我需要在拍摄完照片后用这张照片打开一个新的活动,因此在onAvtivityResult中,我从相机中获取了意图,并为一个新的活动创建了新的意图。我说的对吗?我做到了,现在我有:i/hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh{ru.bunakov.testapplication/ru.bunakov.testapplication.MainActivity}:java.lang.RuntimeException:无法将结果ResultInfo{who=android:fragment:2,request=100,result=-1,data=null}传递到activityIn-onActivityResult i检查是否(resultCode==getActivity().result\u OK&&imageReturned!=null)但在日志中我看到:未能交付结果结果信息{who=android:fragment:1,request=100,result=-1,data=null}如何?//我在intentCamera.putExtra(MediaStore.EXTRA输出,uri)下面添加了MainActivity代码“码><编码>>编码><编码>>编码>,”编码>图图图名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名名hhhhhhhhh:结果正常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.java:3680)上的空对象引用上调用虚拟方法“android.os.Bundle android.content.Intent.getExtras()”,原因是:java.lang.NullPointerException:尝试调用虚拟方法“android.os.Bundle android.content.Intent.getExtras()'在ru.bunakov.testapplication.fragments.FragmentScaling.onActivityResult(FragmentScaling.java:91)上的空对象引用上?
//Uri myUri = ...
intent.setData(myUri);
Uri uri = intent.getData();
//Uri myUri = ...
intent.putStringExtra("uri",myUri.toString());
String uriString = intent.getStringExtra("uri");
Uri uri = Uri.parse(uriString);