无法在第三项活动中加载来自Uri的图片

时间:2017-09-01 20:01:28

标签: java android permissions

我是Android Studio的初学者。我的应用程序允许我添加用户(fn,ln,adrs,Uri :: ImageUri)并列出它们并查看其信息。 我希望能够在点击我的列表视图时显示一个用户的信息。

问题是我只得到一个空白而不是我想要的imageview。

我的主要活动:

公共类MainActivity扩展了AppCompatActivity {

public static ArrayList <User> users =new ArrayList <User>();
public static User userSelected;
public static ListView mListView;


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

    mListView = (ListView) findViewById(R.id.List);

}



public void InputInfo(View view) {
    Intent AddEmployee = new Intent(this, NewEmployeeInfo.class);
    startActivityForResult(AddEmployee,0);

}


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

    super.onActivityResult(0, resultCode, data);
    finaltest =NewEmployeeInfo .targetUri ;
    UserAdapter  useradapter;
    useradapter = new UserAdapter (MainActivity .this, android.R.layout.simple_list_item_1, users  ) ;
    mListView.setAdapter(useradapter );


    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        public void onItemClick(AdapterView<?> adapter, View view, int position, long arg) {

            Intent appInfo = new Intent(MainActivity.this, DisplayInfo.class);
            User temp= users.get(position );
          userSelected =new User(temp.first_name ,temp.last_name,temp.adr,temp.url  );

                startActivity(appInfo);

        }
    });
}

    }

我的第二个(用户输入信息的地方:

public class NewEmployeeInfo extends AppCompatActivity {

public ImageView imageview;
public ImageView targetImage;
public User u;
public static Bitmap photo;
public static Uri targetUri;

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


}

public void takePhoto(View view) {
    Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(takePicture, 0);
}

public void pickphoto(View view) {
    Intent pickPhoto = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(pickPhoto, 1);

}

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    imageview = (ImageView) this.findViewById(imageView);
    resultphoto(requestCode, resultCode, imageReturnedIntent);
}

public void Save(View view) {



        Intent SaveDataIntent = new Intent(this, MainActivity.class);

        EditText FN = (EditText) findViewById(R.id.editText);
        EditText LN = (EditText) findViewById(R.id.editText5);
        EditText ADDRESS = (EditText) findViewById(R.id.editText6);

        String firstname = FN.getText().toString();
        String lastname = LN.getText().toString();
        String address = ADDRESS.getText().toString();

        if (firstname.length() == 0 || lastname.length() == 0 || address.length() == 0) {


            Toast.makeText(this, "No Emty Fields!!",
                    Toast.LENGTH_LONG).show();
            return;

        }


        u = new User(firstname, lastname, address, targetUri);
        users.add(u);





            setResult(RESULT_OK, SaveDataIntent);
            finish();
}


private void resultphoto(int requestCode, int resultCode, Intent imageReturnedIntent) {
    switch (requestCode) {

        case 0:
            if (resultCode == RESULT_OK) {
                targetUri = imageReturnedIntent.getData();

                imageview.setImageURI(targetUri);
                imageReturnedIntent.getExtras().get("data");

            }

            break;
        case 1:


            if (resultCode == RESULT_OK) {
                targetUri = imageReturnedIntent.getData();
                targetImage = (ImageView) findViewById(imageView);

                try {

                    photo = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
                    targetImage.setImageBitmap(photo);
                } catch (FileNotFoundException e) {

                    e.printStackTrace();
                }
            }
            break;
    }

}

}

第三个也是最后一个(应显示信息的地方)

public class DisplayInfo extends AppCompatActivity {
public ImageView imageView;
public Bitmap image;

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

    TextView fn = (TextView) findViewById(R.id.firstname);
    TextView ln = (TextView) findViewById(R.id.lastname);
    TextView adr = (TextView) findViewById(R.id.address);
    imageView = (ImageView) findViewById(R.id.imageView2);

    fn.setText(MainActivity.userSelected.first_name);
    ln.setText(MainActivity.userSelected.last_name);
    adr.setText(MainActivity.userSelected.adr);
    imageView.setImageURI(MainActivity.userSelected.url  ) ;

此错误一直显示

  

E / DatabaseUtils:向parcel写入异常                                                     java.lang.SecurityException:Permission Denial:从pid = 12644读取com.android.providers.media.MediaProvider uri content:// media / external / images / media / 810,uid = 10280需要android.permission.READ_EXTERNAL_STORAGE或grantUriPermission ()

虽然我在清单文件中包含了这些权限:

  

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2 个答案:

答案 0 :(得分:0)

询问runTime权限 tutorial

答案 1 :(得分:0)

我的问题出现在清单文件中;

  

  

<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>
    <activity android:name=".NewEmployeeInfo">
        android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
    </activity>
    <activity android:name=".DisplayInfo" />
    <activity android:name=".UserAdapterActivity"></activity>


    <uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE"
     />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</application>

我放错了我的权限。它应该是这样的

&#13;
&#13;
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mobilonia.employeesapp">
    <uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE"
        />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <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>
        <activity android:name=".NewEmployeeInfo">
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>
        <activity android:name=".DisplayInfo" />
        <activity android:name=".UserAdapterActivity"></activity>



    </application>

</manifest>
&#13;
&#13;
&#13;