Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 复制Android';s画廊_Java_Android_Image_Bitmap - Fatal编程技术网

Java 复制Android';s画廊

Java 复制Android';s画廊,java,android,image,bitmap,Java,Android,Image,Bitmap,目前正在开发一个微型应用程序,其目标是复制Android gallery,我无法让我的应用程序正常工作 事实上,作为使用画布的约束条件,我完全没有权利使用任何布局,我采取了不同的步骤,现在我将向大家解释,以解释问题: 1-我的主要活动是运行两个对象,一个“扫描”对象和一个“GalleryView”对象,这是两个个人类 2-扫描对象使用函数检索库中图像的所有路径 3-MainActivity恢复此arraylist并将其传递给my galleryview的生成器 4-gallery视图知道要显示的

目前正在开发一个微型应用程序,其目标是复制Android gallery,我无法让我的应用程序正常工作

事实上,作为使用画布的约束条件,我完全没有权利使用任何布局,我采取了不同的步骤,现在我将向大家解释,以解释问题:

1-我的主要活动是运行两个对象,一个“扫描”对象和一个“GalleryView”对象,这是两个个人类

2-扫描对象使用函数检索库中图像的所有路径

3-MainActivity恢复此arraylist并将其传递给my galleryview的生成器

4-gallery视图知道要显示的元素数(等于扫描返回的字符串arraylist的大小),并构建每个图像的位图以显示它们

这就是问题所在。事实上,我的手机上有大约480个图像,当我尝试显示它们时,查找GalleryView.java路径列表的位置是一个问题,因为它会使应用程序崩溃

如果我决定只画第一幅图像的480倍,它就行了

所以我想知道如何优化这种行为,以避免崩溃和内存过载

我的老师建议我们用BitmapDrawable代替位图,但我不知道如何实现它

您将在下面找到我的应用程序的所有类+大致解释渲染步骤的图表

MainActivity.java


public class MainActivity extends AppCompatActivity {


    //Objet qui va nous permettre de récuperer les images de la gallerie du téléphone
    ScanPictures m_scan;

    //liste des chemins des images de la gallerie
    ArrayList<String>m_paths;

    //objet qui permet d'afficher les images
    GalleryView m_gallery;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //On créer l'object scanner pour récuperer les photos de la gallerie
        m_scan = new ScanPictures(this.getApplicationContext());

        //Boolean nous indiquant si l'application à l'autorisation d'accéder au contenu interne du téléphone
        Boolean isAuthorized = this.isReadStoragePermissionGranted();

        //Si on est authorisé, on scan la gallerie et on récuperer les chemins des photos
        if(isAuthorized){
            System.out.println("SCAN IMAGES ALREADY GRANTED");
            m_paths = m_scan.getImages();
            System.out.println("SCAN IMAGES ALREADY GRANTED DONE");
        }

        m_gallery = new GalleryView(this.getApplicationContext(),m_paths);
        m_gallery.setPicturesNumber(m_paths.size());
        setContentView(m_gallery);

    }

    public  boolean isReadStoragePermissionGranted() {
        if (Build.VERSION.SDK_INT >= 23) { //le sdk est supérieur a 23, l'autorisation n'est pas donnée automatiquement
            if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {

                //L'autorisation n'est pas accordée, on la demande à l'utilisateur
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 3);
                return false;
            }
        }
        else { //les permissions sont automatiquement données en sdk < 23
            return true;
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //SI l'utilisateur à donner l'autorisation, on scan les photos
            if (requestCode == 3 ) {
                System.out.println("SCAN IMAGES FIRST GRANTED");
                this.m_scan.getImages();
                System.out.println("SCAN IMAGES FIRST GRANTED DONE");
            }
        }
    }
}


public class GalleryView extends View {

    private GestureDetector mGestureDetector;
    private ScaleGestureDetector mScaleGestureDetector;
    private float mScale = 1;
    private Bitmap resized =null;
    private int numColumns, numRows, nbPict;
    private int cellSize;
    private ArrayList<String> m_paths;
    private Context m_context;

    public GalleryView(Context context, ArrayList<String> paths) {
        super(context);

        m_context = context;
        m_paths = paths;
        numColumns = 7;
        mGestureDetector = new GestureDetector(context, new ZoomGesture());
        mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleGesture());
    }

    public void setPicturesNumber(int nbPict) {
        this.nbPict = nbPict;
        calculateDimensions();
    }


    private void calculateDimensions() {
        numRows = nbPict/numColumns;
        cellSize = getWidth() / numColumns;
        invalidate();

    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        calculateDimensions();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.alterralogo);
        int bitmapIndex = 0;
        ArrayList<Bitmap> list = new ArrayList<>();
        Bitmap bitmap = BitmapFactory.decodeFile(m_paths.get(0));

        for(int i = 0 ; i< nbPict;i++){
            list.add(BitmapFactory.decodeFile(m_paths.get(i))); //NOT OPTIMISED AT ALL, MAKE THE APP CRASH
        }

        for (int i = 0; i < numColumns; i++) {
            for (int j = 0; j < numRows; j++) {
                    resized = Bitmap.createScaledBitmap(list.get(bitmapIndex), cellSize, cellSize, true);
                    canvas.drawBitmap(resized, i* cellSize, j * cellSize, null);
                    bitmapIndex++;
            }
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mGestureDetector.onTouchEvent(event);
        mScaleGestureDetector.onTouchEvent(event);
        return true;
    }

    public class ZoomGesture extends GestureDetector.SimpleOnGestureListener {
        private boolean normal = true;

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return true;
        }
    }

    public class ScaleGesture extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            if(numColumns !=1){
                numColumns--;
                calculateDimensions();
            }
            invalidate();
            return true;
        }
    }
}

public class ScanPictures {

    Context m_application_context;

    public ScanPictures(Context activity_context){
        m_application_context = activity_context;
    }

    public ArrayList<String> getImages(){

        ArrayList<String> paths = new ArrayList<String>(); //liste qui va contenir les chemins vers les images de la gallerie

        String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME };

        String selection = MediaStore.Images.Media.BUCKET_DISPLAY_NAME + " = ? ";

        String selectionArgs[] = {"Camera"};

        String orderBy = MediaStore.Images.Media.DATE_TAKEN;
        //Stores all the images from the gallery in Cursor
        Cursor cursor = m_application_context.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, orderBy);

        //Total number of images
        int count = cursor.getCount();

        //Create an array to store path to all the images
        String[] arrPath = new String[count];

        for (int i = 0; i < count; i++) {
            cursor.moveToPosition(i);
            int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);

            //Store the path of the image
            arrPath[i]= cursor.getString(dataColumnIndex);
            paths.add(arrPath[i]);

        }

        System.out.println(paths);

        return  paths;
    }
}


公共类MainActivity扩展了AppCompatActivity{
//我们的目标是在电话的厨房里拍摄照片
扫描图片m_扫描;
//画廊图片列表
ArrayListm_路径;
//这是一张照片
GalleryView m_画廊;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//在créer l'object扫描仪上,为gallerie的照片倒杯
m_scan=新的扫描图片(this.getApplicationContext());
//布尔逻辑独立性是电话内部内容自动化的应用
布尔值isAuthorized=this.isReadStoragePermissionGrated();
//这是我的授权,这是我的照片
如果(未授权){
System.out.println(“已授权扫描图像”);
m_path=m_scan.getImages();
System.out.println(“已完成扫描图像”);
}
m_gallery=newGalleryView(this.getApplicationContext(),m_路径);
m_gallery.setPicturesNumber(m_path.size());
setContentView(美术馆);
}
公共布尔值IsReadStoragePermissionGrated(){
如果(Build.VERSION.SDK_INT>=23){//le SDK est supérieur a 23,则自动生成不属于自动请求
if(checkSelfPermission(Manifest.permission.READ\u外部存储)
==PackageManager.权限(已授予){
返回true;
}否则{
//自动化是一种协议,在使用需求上
ActivityCompat.requestPermissions(这个新字符串[]{Manifest.permission.READ_EXTERNAL_STORAGE},3);
返回false;
}
}
else{//les permissions sont automatiquement données en sdk<23
返回true;
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予){
//在扫描les照片上,我使用了donner l'autorisation
if(requestCode==3){
System.out.println(“先授权扫描图像”);
这个.m_scan.getImages();
System.out.println(“扫描图像首先授权完成”);
}
}
}
}
GalleryView.java


public class MainActivity extends AppCompatActivity {


    //Objet qui va nous permettre de récuperer les images de la gallerie du téléphone
    ScanPictures m_scan;

    //liste des chemins des images de la gallerie
    ArrayList<String>m_paths;

    //objet qui permet d'afficher les images
    GalleryView m_gallery;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //On créer l'object scanner pour récuperer les photos de la gallerie
        m_scan = new ScanPictures(this.getApplicationContext());

        //Boolean nous indiquant si l'application à l'autorisation d'accéder au contenu interne du téléphone
        Boolean isAuthorized = this.isReadStoragePermissionGranted();

        //Si on est authorisé, on scan la gallerie et on récuperer les chemins des photos
        if(isAuthorized){
            System.out.println("SCAN IMAGES ALREADY GRANTED");
            m_paths = m_scan.getImages();
            System.out.println("SCAN IMAGES ALREADY GRANTED DONE");
        }

        m_gallery = new GalleryView(this.getApplicationContext(),m_paths);
        m_gallery.setPicturesNumber(m_paths.size());
        setContentView(m_gallery);

    }

    public  boolean isReadStoragePermissionGranted() {
        if (Build.VERSION.SDK_INT >= 23) { //le sdk est supérieur a 23, l'autorisation n'est pas donnée automatiquement
            if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                return true;
            } else {

                //L'autorisation n'est pas accordée, on la demande à l'utilisateur
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 3);
                return false;
            }
        }
        else { //les permissions sont automatiquement données en sdk < 23
            return true;
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //SI l'utilisateur à donner l'autorisation, on scan les photos
            if (requestCode == 3 ) {
                System.out.println("SCAN IMAGES FIRST GRANTED");
                this.m_scan.getImages();
                System.out.println("SCAN IMAGES FIRST GRANTED DONE");
            }
        }
    }
}


public class GalleryView extends View {

    private GestureDetector mGestureDetector;
    private ScaleGestureDetector mScaleGestureDetector;
    private float mScale = 1;
    private Bitmap resized =null;
    private int numColumns, numRows, nbPict;
    private int cellSize;
    private ArrayList<String> m_paths;
    private Context m_context;

    public GalleryView(Context context, ArrayList<String> paths) {
        super(context);

        m_context = context;
        m_paths = paths;
        numColumns = 7;
        mGestureDetector = new GestureDetector(context, new ZoomGesture());
        mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleGesture());
    }

    public void setPicturesNumber(int nbPict) {
        this.nbPict = nbPict;
        calculateDimensions();
    }


    private void calculateDimensions() {
        numRows = nbPict/numColumns;
        cellSize = getWidth() / numColumns;
        invalidate();

    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        calculateDimensions();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.alterralogo);
        int bitmapIndex = 0;
        ArrayList<Bitmap> list = new ArrayList<>();
        Bitmap bitmap = BitmapFactory.decodeFile(m_paths.get(0));

        for(int i = 0 ; i< nbPict;i++){
            list.add(BitmapFactory.decodeFile(m_paths.get(i))); //NOT OPTIMISED AT ALL, MAKE THE APP CRASH
        }

        for (int i = 0; i < numColumns; i++) {
            for (int j = 0; j < numRows; j++) {
                    resized = Bitmap.createScaledBitmap(list.get(bitmapIndex), cellSize, cellSize, true);
                    canvas.drawBitmap(resized, i* cellSize, j * cellSize, null);
                    bitmapIndex++;
            }
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mGestureDetector.onTouchEvent(event);
        mScaleGestureDetector.onTouchEvent(event);
        return true;
    }

    public class ZoomGesture extends GestureDetector.SimpleOnGestureListener {
        private boolean normal = true;

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return true;
        }
    }

    public class ScaleGesture extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            if(numColumns !=1){
                numColumns--;
                calculateDimensions();
            }
            invalidate();
            return true;
        }
    }
}

public class ScanPictures {

    Context m_application_context;

    public ScanPictures(Context activity_context){
        m_application_context = activity_context;
    }

    public ArrayList<String> getImages(){

        ArrayList<String> paths = new ArrayList<String>(); //liste qui va contenir les chemins vers les images de la gallerie

        String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME };

        String selection = MediaStore.Images.Media.BUCKET_DISPLAY_NAME + " = ? ";

        String selectionArgs[] = {"Camera"};

        String orderBy = MediaStore.Images.Media.DATE_TAKEN;
        //Stores all the images from the gallery in Cursor
        Cursor cursor = m_application_context.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, selectionArgs, orderBy);

        //Total number of images
        int count = cursor.getCount();

        //Create an array to store path to all the images
        String[] arrPath = new String[count];

        for (int i = 0; i < count; i++) {
            cursor.moveToPosition(i);
            int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);

            //Store the path of the image
            arrPath[i]= cursor.getString(dataColumnIndex);
            paths.add(arrPath[i]);

        }

        System.out.println(paths);

        return  paths;
    }
}

公共类GalleryView扩展视图{
私人手势检测器mGestureDetector;
专用标尺检测器mScaleGestureDetector;
私人浮动mScale=1;
私有位图已调整大小=null;
私人int numColumns、numRows、nbPict;
私人单位;
私有数组列表m_路径;
私有语境m_语境;
公共GalleryView(上下文、ArrayList路径){
超级(上下文);
m_context=上下文;
m_路径=路径;
numColumns=7;
mGestureDetector=新的手势检测器(上下文,新的ZoomGeture());
mScaleGestureDetector=new-scalegstruedetector(上下文,new-scalegstrue());
}
公共无效设置图片编号(int nbPict){
this.nbPict=nbPict;
计算尺寸();
}
私有无效计算维度(){
numRows=nbPict/NUM列;
cellSize=getWidth()/numColumns;
使无效();
}
@凌驾
已更改尺寸的受保护空心(整数w、整数h、整数oldw、整数oldh){
super.onSizeChanged(w,h,oldw,oldh);
计算尺寸();
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
//位图Bitmap=BitmapFactory.decodeResource(getContext().getResources(),R.drawable.alteralogo);
int bitmapIndex=0;
ArrayList=新建ArrayList();
位图位图=BitmapFactory.decodeFile(m_path.get(0));
对于(int i=0;i