【问题标题】:how to put a picture in the internal memory of the app?如何将图片放入应用程序的内存中?
【发布时间】:2016-05-18 07:16:30
【问题描述】:

我正在尝试从相机应用程序中拍摄照片并将其保存到应用程序的文件中,搜索直到现在才引导我找到有关内容 Uris 的内容。(我不知道它们是什么或如何使用它们)。我已经能够将照片保存在外部存储器中,所以如果有办法将照片从那里移动到 apk 文件中,那就太好了。

我想放照片的路径是“appname/app/src/main/assets/photos”

这是我现在的代码:

public class Add_Comment_Picture extends AppCompatActivity {
    static final int CAM_REQUEST = 1;
    ImageView imageView;
    ImageButton button;
    private static final int REQUEST_CODE = 1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add__comment__picture);
    //    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
        button = (ImageButton) findViewById(R.id.imageButtonCamera);
        imageView = (ImageView) findViewById(R.id.imageView);

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                File file = getFile();
                camera_intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
                startActivityForResult(camera_intent , CAM_REQUEST);
            }
        });


    }

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

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            int hasWritePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            int hasReadPermission = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
            int hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);

            List<String> permissions = new ArrayList<String>();
            if (hasWritePermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }

            if (hasReadPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
            }

            if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.CAMERA);
            }
            if (!permissions.isEmpty()) {
                requestPermissions(permissions.toArray(new String[permissions.size()]), 111);
            }
        }


    }

    private File getFile()
    {
        File folder = new File("sdcard/camera_app");
        if (!folder.exists())
        {
            folder.mkdir();
        }
        File image_file = new File(folder,"cam_image.jpg");
        return image_file;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String path = "sdcard/camera_app/cam_image.jpg";
        imageView.setImageDrawable(Drawable.createFromPath(path));
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 111: {
                for (int i = 0; i < permissions.length; i++) {
                    if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                        System.out.println("Permissions --> " + "Permission Granted: " + permissions[i]);


                    } else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                        System.out.println("Permissions --> " + "Permission Denied: " + permissions[i]);

                    }
                }
            }
            break;
            default: {
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
        }
    }
}

【问题讨论】:

    标签: android memory android-camera uri internal


    【解决方案1】:

    您的 apk 文件有点像 android 应用程序安装文件。它是一个压缩文件,您也可以使用 7-Zip 或类似程序打开它。当您在设备上安装应用程序时,该文件将被提取到您的内存中。

    URI 代表统一资源标识符。它识别您的资源,在您的情况下是拍摄的照片。

    您可以将图片保存到您的内部或外部存储器。如果你想使用你需要权限的外部存储器:

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

    如果您将文件保存到内存中,其他应用程序将无法看到该文件,并且您无法使用 af 文件资源管理器找到它。如果它是外部的,您将在文件资源管理器中找到它。

    在 Stackoverflow 上查看有关如何保存相机文件的答案:

    Stackoverflow Camera Intent

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
    
    // start the image capture Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    

    然后,在 onActivityResult 中,将 data.getData() 替换为 fileUri.toString(),它会解决你的问题。

    【讨论】:

      【解决方案2】:

      apk 文件意味着它包含所有类文件、资源文件(图像、视频等)、验证证书文件等等。根据您的资产文件夹,它只会将其在编程中的处理方式视为资源文件。一旦在运行环境中生成 apk 文件,它就会得到转换后的 dex 文件。您不能修改文件的内容。

      正如我上面所说,在这条路径上保存是不可能的。 appname/app/src/main/assets/photos

      但你可以让你的应用程序内存,你可以创建文件并在你想要的时候使用。

      【讨论】:

        【解决方案3】:

        无法保存您从相机应用中拍摄的照片,因为这些照片是在运行时创建的,并且您的源文件夹(“appname/app/src/main/assets/photos”)中的文件必须是在编译时添加(甚至在编译时间之前)。

        【讨论】:

          【解决方案4】:

          您不能在生成 apk 后更改资产值,您只能将照片存储到 data\data\yourpackagename\photos 中,但这会增加您设备中的应用程序大小

          【讨论】:

            【解决方案5】:

            一个apk文件包括:

            资产、META-IFN、res folder。

            AndroidManifest.xml、classes.dex 和 resources.arsc

            在设备上部署后,apk 会生成一个文件夹,通常位于 /data/data/your.package.name/ 中。

            我鼓励您将文件保存在专用区域中。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-07-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多